Android开发笔记——零基础入门(最终完成一个智能家居APP)(附源码)

Android开发笔记——零基础入门(最终完成一个智能家居APP)(附源码),第1张

最终实现展示:

软件tips: 在.xml文件中,选中内容按ctrl+shift+/将其变为注释,一般不建议在这些文件中加注释 ctrl+1,可添加try,或者添加强制类型装换 可以自动调整格式 如果调试过程中出现修改未被执行,可以将gen中的R.java删掉,然后重新运行 logcat位置 1.基本配置 新建工程,Package Name中不能含有中文 运行App 提示是否用自带的模拟器,选择否,使用夜神模拟器 选择显示提示/错误信息 如何关联模拟器: 找到Java软件安装目录里的adb.exe,复制路径如E:\Java_class_use\adt-bundle-windows-x86_64-20131030\sdk\platform-tools 配置电脑环境变量,在系统变量中,找到Path,然后新建,将路径粘贴进去 打开模拟器,然后打开cmd,输入adb connect 127.0.0.1:62001 注:127.0.0.1是本地网络地址,62001是夜神模拟器暴露出来的端口号,如果连接失败输入adb kill-server,adb start-server 2.安卓工程目录文件夹介绍 src 存放java代码的,有包,有文件 gen 存放自动生成的文件,需要关心的是里面的R.java,存放程序页面、按键、文本等控件的ID Android 4.4与Android Private Libraries存放的安卓开发的库,供开发者调用 Asserts 存放一些资源,配置文件、图片 bin 编译后会生产的一些文件,包括我们关心得.apk,可以直接拖进模拟器 libs 依赖库 res  drawable-* 存放app程序要用到的一些图片 layout  存放布局文件的文件夹,一般的一个安卓页面(activity)对应一个布局 values  存放一些参数,或者自定义控件的文件 AndroidManifest.xml  API的配置 权限管理:网络访问权限,名片夹访问权限,相机访问权限 目标机器SDK版本 APP的名字,图标 配置第一个被加载,启动页面 3.布局 res->layout->activity_main.xml  配置界面的样式,设置属性参数 举例:布局底下有两个控件,一个文本框,一个控件                />             /> 4.练习——显示图片 在MainActivity.java中ctrl+activity_main跳转 设置高度宽度,输入wi或hi按alt+/快速选择输入 在res中插入一张图片 添加android:background="@drawable/ccc"(注原来程序尽量不动) 练习——显示两张图片

    
    
    
    
    
    
    
  

5.相对布局RelativeLayout常用属性

    
    

----------------------------------------------------------------------
RelativeLayout用到的一些重要的属性:


    第一类:属性值为true或false
    android:layout_centerHrizontal  水平居中
    android:layout_centerVertical 垂直居中
    android:layout_centerInparent    相对于父元素完全居中
    android:layout_alignParentBottom 贴紧父元素的下边缘
    android:layout_alignParentLeft   贴紧父元素的左边缘
    android:layout_alignParentRight  贴紧父元素的右边缘
    android:layout_alignParentTop    贴紧父元素的上边缘
    android:layout_alignWithParentIfMissing  如果对应的兄弟元素找不到的话就以父元素做参照物


    第二类:属性值必须为id的引用名“@id/id-name”
    android:layout_below      在某元素的下方
    android:layout_above      在某元素的的上方
    android:layout_toLeftOf   在某元素的左边
    android:layout_toRightOf  在某元素的右边


    android:layout_alignTop   本元素的上边缘和某元素的的上边缘对齐
    android:layout_alignLeft  本元素的左边缘和某元素的的左边缘对齐
    android:layout_alignBottom 本元素的下边缘和某元素的的下边缘对齐
    android:layout_alignRight  本元素的右边缘和某元素的的右边缘对齐


    第三类:属性值为具体的像素值,如30dip,40px
    android:layout_marginBottom              离某元素底边缘的距离
    android:layout_marginLeft                   离某元素左边缘的距离
    android:layout_marginRight                 离某元素右边缘的距离
    android:layout_marginTop                   离某元素上边缘的距离
----------------------------------------------------------------------
android:id —— 为控件指定相应的ID
android:text —— 指定控件当中显示的文字,需要注意的是,这里尽量使用strings.xml文件当中的字符串
android:textSize —— 指定控件当中字体的大小
android:background —— 指定该控件所使用的背景色,RGB命名法 #FFFFFF或@android:color/white
android:width —— 指定控件的宽度
android:height —— 指定控件的高度
android:sigleLine —— 如果设置为真的话,则将控件的内容只能在同一行当中进行显示
android:grivity —— 指定控件中的内容的基本位置,比如说居中,居右等位置
android:layout_gravity 控件本身相对于父视图的位置
//此属性值为带单位的数值 在所有视图中都可使用
android:padding —— 指定控件的四周的内部留出一定的空间
android:paddingLeft —— 指定控件的左边的内部留出一定的空间
android:paddingTop —— 指定控件的上边的内部留出一定的空间
android:paddingRight —— 指定控件的右边的内部留出一定的空间
android:paddingBottom —— 指定控件的下边的内部留出一定的空间
//此属性值为带单位的数值 在所有视图中都可使用
android:layout_margin—— 指定控件的四周的外部留出一定的空间
android:layout_marginLeft—— 指定控件的左边的外部留出一定的空间
android:layout_marginTop—— 指定控件的上边的外部留出一定的空间
android:layout_marginRight—— 指定控件的右边的外部留出一定的空间
android:layout_marginBottom—— 指定控件的下边的外部留出一定的空间
//此属性值为引用id 只能在相对布局中都可使用
android:layout_above 将该控件的底部与给定ID的控件之上部对齐
android:layout_below 将该控件的上部与给定ID的控件之下部对齐
android:layout_toLeftOf 将该控件的右与给定ID的控件之左边对齐
android:layout_toRightOf 将该控件的左边与给定ID的控件的右边对齐
//此属性值为引用id 只能在相对布局中都可使用
android:layout_alignTop 将该控件的上部与给定ID的控件之上部对齐
android:layout_alignBottom 将该控件的下部与给定ID的控件之下部对齐
android:layout_alignLeft 将该控件的左与给定ID的控件之左边对齐
android:layout_alignRight 将该控件的右边与给定ID的控件的右边对齐
android:layout_alignBaseline 该控件的baseline和给定ID的控件的baseline对齐
//此属性值为引用id 只能在相对布局中都可使用
android:alignParentBottom 如果该值为true,则将该控件的底部和父控件的底部对齐
android:layout_alignParentLeft 如果该值为true,则将该控件的左边与父控件的左边对齐
android:layout_alignParentRight 如果该值为true,则将该控件的右边与父控件的右边对齐
android:layout_alignParentTop 如果该值为true,则将空间的顶部与父控件的顶部对齐
android:layout_centerHorizontal 如果值为真,该控件将被至于水平方向的中央
android:layout_centerInParent 如果值为真,该控件将被至于父控件水平方向和垂直方向的中央
android:layout_centerVertical 如果值为真,该控件将被至于垂直方向的中央
----------------------------------------------------------------------
相对布局综合演练——智能家居刷卡界面

    
        
    
     
    

6.美化按键 参考博文( https://blog.csdn.net/tracydragonlxy/article/details/88552262) 在drawable-mdpi下新建3个xml文件 更改程序 btn_selector.xml


    
    
    
    

btn_normal.xml


    
    
    
    

btn_pressed.xml


    
    
    
    

7.线性布局 实现样式 代码

    
        
            
            
        
        
            
            
        
    

插入水平线 代码


    
    

8.按键响应的第一种方式(xml中的onclick属性) 在xml中设置按键的onclick绑定的函数

    

9.按键响应的第二种方式(接口类) 安卓开发中的监听器(onclicklistener) 自定义类实现按键监听事件的接口 通过findViewByld绑定局部变量button和xml中的button 实现接口类,在类中实现onclieck方法,写业务代码 为1.2两步做的准备进行绑定,使得按键被按下后执行业务代码
package com.example.yhq;


import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

class MyClieckHandler implements View.OnClickListener {

    @Override
    public void onClick(View v) {
        // TODO 自动生成的方法存根
           switch(v.getId()) {
           case R.id.button1:
               System.out.println("按键1被按下");
               break;
           case R.id.button2:
               System.out.println("按键2被按下");        
               break;
           }
    }
}


public class MainActivity extends Activity {


    Button btn1;  //此时为野指针         定义局部变量
    Button btn2;
        
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //通过方法将其与按钮组件联系起来,此处需要强转换
        btn1 = (Button)findViewById(R.id.button1);                 //绑定xml
        btn2 = (Button)findViewById(R.id.button2);
        
        btn1.setOnClickListener(new MyClieckHandler());            //设置监听器
        btn2.setOnClickListener(new MyClieckHandler());
              
    }
}

9.按键响应的第三种方式(匿名内部类)
package com.example.yhq;


import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;


public class MainActivity extends Activity {


    Button btn1;  //此时为野指针
    Button btn2;
        
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //通过方法将其与按钮组件联系起来,此处需要强转换
        btn1 = (Button)findViewById(R.id.button1);
        btn2 = (Button)findViewById(R.id.button2);
        //匿名内部类,由于没有名字,需要现场建类实现里面的接口
        btn1.setOnClickListener(new View.OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                // TODO 自动生成的方法存根
                System.out.println("按键1被按下");


            }
        });  
        btn2.setOnClickListener(new View.OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                // TODO 自动生成的方法存根
                System.out.println("按键2被按下");    
            }
        });
    }
}

10.按键响应的第四种方式(Activity_P)
package com.example.yhq;


import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
//为整个页面实现一个onClick这个接口,具备点击的事件处理,也要让btn跟页面功能建立联系
public class MainActivity extends Activity implements View.OnClickListener {


    Button btn1;  //此时为野指针
    Button btn2;
        
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //通过方法将其与按钮组件联系起来,此处需要强转换
        btn1 = (Button)findViewById(R.id.button1);
        btn2 = (Button)findViewById(R.id.button2);
        
        btn1.setOnClickListener(this);
        btn2.setOnClickListener(this);
        
    }


    @Override
    public void onClick(View v) {
        // TODO 自动生成的方法存根
         switch(v.getId()) {
         case R.id.button1:
             System.out.println("按键1被按下");
             break;
         case R.id.button2:
             System.out.println("按键2被按下");        
             break;
    }
    }
}

11.安卓页面跳转 创建新页面 新建,右键src新建other
package com.example.yhq;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle  savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void goSecond(View v) {
     //intent去设置要跳转的页面                       //当前页面,跳转页面的类
        Intent intent = new Intent(this,  SecondActivity.class);
        //跳转
        startActivity(intent);
    }   
}
    

页面跳转传参方式一 修改第一个页面的程序,使其传递数据
package com.example.yhq;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle  savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void goSecond(View v) {
     //intent去设置要跳转的页面                       //当前页面,跳转页面的类
        Intent intent = new Intent(this,  SecondActivity.class);
                     //键                           值
        intent.putExtra("MyData", "皓清很帅");
        
        //跳转
        startActivity(intent);
    }   
}

修改第二个页面的程序,使其接收数据
package com.example.yhq;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class SecondActivity extends Activity {
    private String data;
    @Override
    protected void onCreate(Bundle  savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        
        Intent i = this.getIntent();
        data = i.getStringExtra("MyData");
        System.out.println("收到数据, "+data);
        Toast.makeText(this, "收到数据"+data,  0).show();
    }
    public void goThird(View v) {
     //intent去设置要跳转的页面                       //当前页面,跳转页面的类
        Intent intent = new Intent(this,  ThirdActivity.class);
        //跳转
        startActivity(intent);
    }   
}

页面跳转传参方式二 修改第一个页面的程序,使其传递数据
package com.example.yhq;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle  savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void goSecond(View v) {
     //intent去设置要跳转的页面                       //当前页面,跳转页面的类
        Intent intent = new Intent(this,  SecondActivity.class);
        Bundle bundle = new Bundle();
        bundle.putString("MyData", "皓清很帅");
        bundle.putInt("ID", 100);
        intent.putExtras(bundle);
        //跳转
        startActivity(intent);
    }   
}

修改第二个页面的程序,使其接收数据
package com.example.yhq;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class SecondActivity extends Activity {
    private String data;
    @Override
    protected void onCreate(Bundle  savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        
        Intent i = this.getIntent();
        Bundle b = i.getExtras();
        String data = b.getString("MyData");
        int data2 = b.getInt("ID");
        Toast.makeText(this, "收到数据"+data,  0).show();
    }
    public void goThird(View v) {
     //intent去设置要跳转的页面                       //当前页面,跳转页面的类
        Intent intent = new Intent(this,  ThirdActivity.class);
        //跳转
        startActivity(intent);
    }   
}

12.安卓线程实现页面的自动跳转
package com.example.yhq;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle  savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
      //实例化一个线程,使用构造方法来初始化,即通过接口Runnable设置新线程要执行的任务
        Thread t = new Thread(new Runnable() {
            
            @Override
            public void run() {
                // TODO 自动生成的方法存根
                 try {   //sleep会睡眠UI线程的刷新,所以要在新线程中使用sleep
                        Thread.sleep(3000);
                    } catch  (InterruptedException e) {
                        // TODO 自动生成的 catch  块
                        e.printStackTrace();
                    }
                 //intent去设置要跳转的页面                       //当前页面,跳转页面的类
                    Intent intent = new  Intent(MainActivity.this, SecondActivity.class);
                    //跳转
                    startActivity(intent);
            }
        }); //实例化一个线程
        t.start(); //启动线程
    }  
}

13.Activity(页面)的生命周期 1.启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。 2.当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行。 3.当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onResume方法,再次进入运行状态。 4.当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。 5.用户后退回到此Activity:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。 6.当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。 7.用户退出当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity。 14.安卓Socket客户端开发 activity_main.xml

    

MainActivity.java
package com.example.hq;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import com.example.hq.nets.NetUtils;
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle  savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void sendMessage(View v) {
        switch (v.getId()) {
        case R.id.fh:
            NetUtils.sendMessageHandler("goforward");
            break;
        case R.id.back:
            NetUtils.sendMessageHandler("goback");
            break;
        case R.id.right:
            NetUtils.sendMessageHandler("goright");
            break;
        case R.id.left:
            NetUtils.sendMessageHandler("goleft");
            break;
        }
    }
}

NetUtils.java
package com.example.hq.nets;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class NetUtils {
    public static void sendMessageHandler(final  String command) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                // TODO 自动生成的方法存根
                try {
                    Socket client = new  Socket("192.168.3.5", 8806);// 创建套接字
                    OutputStream out =  client.getOutputStream(); // 获得数据发送通道
                    out.write(command.getBytes()); // 发送数据
                    InputStream in =  client.getInputStream(); // 获得数据接收通道
                    int len;
                    byte[] data = new byte[128];
                    len = in.read(data);// 接收通道接收数据
                    System.out.println("获得服务器端返回数据是:"
                            + new String(data,  0, len));
                } catch (IOException e) {
                    // TODO 自动生成的 catch 块
                    e.printStackTrace();
                }
            }
        }).start();
    }
}

15.实现倒计时10s——非UI控件想要修改线程,使用Handler类解决 MainActivity.java
package com.example.hq;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends Activity {
    
    public TextView textView;
    
    public Handler h;
    @Override
    protected void onCreate(Bundle  savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //关联UI控件,需要类型强制转换
        textView = (TextView)  findViewById(R.id.textView);
        
        h = new Handler() {  //UI主线程的家里的电话,处理一些其他进程无法处理的事件
         @Override
         public void handleMessage(Message msg) {   //区分事件的类型
             // TODO 自动生成的方法存根
             super.handleMessage(msg);
             textView.setText(msg.what+"s");   //接到电话则会修改控件
         }
        };    
    }
    public void testFunc(View v) {
     
     new Thread(new Runnable() {
            
            @Override
            public void run() {
                // TODO 自动生成的方法存根
                for (int i = 10; i >= 0; i--) {
                    System.out.println("yhq"+i);
                    Message msg = new Message();
                    msg.what = i;
                    //打电话,去把UI要显示、处理的事件交给UI线程的Handler去做
                    h.sendMessage(msg);
                    try {
                        Thread.sleep(1000);
                    } catch  (InterruptedException e) {
                        // TODO 自动生成的 catch  块
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }
    
}

注,导Handler包时,选第一个 activity_main.xml

    
    

16.安卓客户端可收发并刷新UI控件显示 activity_main.xml

    

MainActivity.java
package com.example.hq;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.TextView;
import com.example.hq.nets.NetUtils;
public class MainActivity extends Activity {
    Handler handler;
    TextView tx;
    
    @Override
    protected void onCreate(Bundle  savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        tx = (TextView)findViewById(R.id.tx);
        
        handler = new Handler() {
            private CharSequence String;
            public void handleMessage(Message  msg) {
                super.handleMessage(msg);
                Bundle b = msg.getData();
                String string =  b.getString("msg");
                
                tx.setText(string);
            }
        
        };
    }
    public void sendMessage(View v) {
        switch (v.getId()) {
        case R.id.fh:
            NetUtils.sendMessageHandler("goforward",  handler);
            break;
        }
    }
}

NetUtils.java
package com.example.hq.nets;


import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;


import android.os.Bundle;
import android.os.Handler;
import android.os.Message;


public class NetUtils {


    public static void sendMessageHandler(final String command,final Handler h) {


        new Thread(new Runnable() {


            @Override
            public void run() {
                // TODO 自动生成的方法存根
                try {
                    Socket client = new Socket("192.168.3.5", 8806);// 创建套接字
                    OutputStream out = client.getOutputStream(); // 获得数据发送通道
                    out.write(command.getBytes()); // 发送通道发送数据
                    
                    InputStream in = client.getInputStream(); // 获得数据接收通道
                    int len;
                    byte[] data = new byte[128];
                    len = in.read(data);// 接收通道接收数据
                    String str = new String(data, 0, len);
                    Message msg = new Message();
                    
                    Bundle b = new Bundle();
                    b.putString("msg", str);
                    msg.setData(b);
                    
                    h.sendMessage(msg);
                    
                    
                } catch (IOException e) {
                    // TODO 自动生成的 catch 块
                    e.printStackTrace();
                }
            }
        }).start();


    }
}

17.WebView控件的使用 https://blog.csdn.net/weixin_40438421/article/details/85700109 增加访问权限 或者直接在.xml文件中输入 保存 MainActivity.java
package com.example.hq;
import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle  savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
    final WebView wb =  (WebView)findViewById(R.id.webView1);
    wb.setWebViewClient(new WebViewClient());//使用自带浏览器
    
    final EditText ed = (EditText)  findViewById(R.id.ed);
    ed.setOnEditorActionListener(new  TextView.OnEditorActionListener() {
        
        @Override
        public boolean onEditorAction(TextView  arg0, int arg1, KeyEvent event) {
            // TODO 自动生成的方法存根
            String str =  ed.getText().toString();
            wb.loadUrl(str);
            return (event.getKeyCode() ==  KeyEvent.KEYCODE_ENTER);
        }
    });   
    }
}

activity_main.xml

    
        
        
        
        
    
    
    
    

18.智能家居项目APP开发 activity_main.xml(主页面布局设置)

    
    
    
        
           
           
           
        
        
        
            
           
           
                               
        
        
    
    
    
        

MainActivity.java(主页面程序)
package com.example.hq;
import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle  savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        WebView wb = (WebView)  findViewById(R.id.webView1);
        wb.loadUrl("https://tianqi.2345.com/");
        wb.setWebViewClient(new WebViewClient());
    
    
    }
}

activity_main.xml(启动页面布局设置)

     
    

WelcomeActivity.java(启动页面程序)
package com.example.hq;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;
public class WelcomeActivity extends Activity {
    TextView textview;  
    Handler h;
    @Override
    protected void onCreate(Bundle  savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_welcome);
    
    
        textview = (TextView)  findViewById(R.id.textView);
        h = new Handler() {
            @Override
            public void handleMessage(Message  msg) {
                // TODO 自动生成的方法存根
                super.handleMessage(msg);
                textview.setText(msg.what+"s");
                
            }
        };
        
        new Thread(new Runnable() {
            
            @Override
            public void run() {
                // TODO 自动生成的方法存根
                for (int i = 3; i > 0; i--) {
                    Message msg = new Message();
                    msg.what = i;
                    h.sendMessage(msg);
                    try {
                        Thread.sleep(1000);
                    } catch  (InterruptedException e) {
                        // TODO 自动生成的 catch  块
                        e.printStackTrace();
                    }
                }
                Intent intent = new  Intent(WelcomeActivity.this,  MainActivity.class);
                startActivity(intent);  //启动页面
            }
        }).start();
    
    
    
    }
}

AndroidMainifest.xml


    
    
    
        
          
        
       
        
               
                
                
            
        
    

包资源管理 实际界面展示

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/992893.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)