Android基础之四:四大组件(Activity)

  • 一个Activity表示一个屏幕,当然在早期应用程序中这样理解可能不太准确,因为早期很多效果都是使用对话框形式的Activity或者半透明半覆盖的Activity来在当前Activity中显示相关操作的,但是现在只要是合格的程序员都不会再在同一个屏幕中显示两个以上Activity
  • 创建Activity
    • 创建继承自Activity的类
      • Activity的生命周期
        • onCreate:创建
        • onStart:开始显示
        • onResume:完全显示,处于激活状态,拥有焦点
        • onPause:退出到下层显示
        • onSaveInstanceState:保存状态响应
        • onStop:退出显示
        • onDestory:销毁释放
        • onReStart:从退出显示状态重新显示
        • onConfigurationChanged:配置发生改变,需要在Manifest中注册的时候添加configchange参数
      • 定义Activity通常需要重写的方法
        • onCreate:必有
        • onDestory:一般有
        • onConfigurationChanged:一般有
        • onSaveInstanceState:一般有
      • Activity切换发生的生命周期变化:A-->B
        • A:onPause
        • B:onCreate
        • B:onStart
        • B:onResume
        • A:onStop(可能不触发,当B不完全覆盖A时不触发)
      • 在Manifest文件中注册Activity
        • activity节点
          • 是application的子节点,属性默认继承自application
        • 属性
          • icon:ActionBar中显示的图标
          • logo:ActionBar中显示的徽标
          • name:实现类
          • label:ActionBar中显示的标题
          • describtion:描述
          • theme:主题
          • alwaysRetainTaskState:保持后台运行,尽量不自动销毁回收
          • configChanges:需要监听的配置信息
          • enabled:是否可用
          • permission:需求权限
          • exported:是否公开,用于外部应用跨应用使用Activity
          • hardwareAccelerated:硬件加速
          • launchMode:启动模式
          • screenOritation:屏幕方向
          • windowSoftInputType:键盘弹出方式
          • showOnLockScreen:在锁屏中显示,类似QQ
        • 子节点
          • category:类别,一般默认为DEFAULT,主Activity为LAUNCHER
          • action:一般自定义,但是注意特殊action:BROWSERABLE和VIEW
          • data:路由匹配
            • scheme:协议
            • host:IP
            • port:端口
            • path:路径
        • action与data通常用于隐式Intent加载Activity需要
      • 代码中启动与关闭Activity
        • 无返回值启动:startActivity(intent)
        • 监听返回值启动:startActivityForResult(intent)
          • onActivityResult
        • 关闭当前Activity:finish()
        • 关闭之前给上一个Activity返回值:setResult(resultCode,intent);
        • 关于启动Activity的Intent
          • 显示Intent:通过Activity类名来创建:
          • Intent intent=new Intent(MyActivity.this,TAct.class);
          • 通过setComponent创建显示Intent
          • Intent intent=new Intent();
            intent.setComponent(new ComponentName(getPackageName(),"com.example.AndroidTest_01.TAct"));//全路径
          • 隐式Intent
            • 通过action创建
            • Intent intent=new Intent("con.example.AndroidTest_01.action.test");
              //或者
              Intent intent=new Intent();
              intent.setAction("con.example.AndroidTest_01.action.test");
            • 通过data创建
            •  Intent intent=new Intent();
               intent.setData(Uri.parse("scheme://host:port/path"));
            • 隐式Intent启动Activity需要先判断能否解析成Activity
            • ComponentName componentName=intent.resolveActivity(getPackageManager());
              if(componentName==null){
                   //..无法解析
              }
        • 启动Activity数据传递
          • putExtra()方式附加到intent中传递
          • intent.putExtra("a","sss");
          • putExtra()附加Bundle
          •  Bundle bundle=new Bundle();
             bundle.putString("title","aaaaa");
             intent.putExtra("a",bundle);

            Bundle是Android中一个数据结构优化机制类,与Java中的Map一样,但是Bundle更加高效,在Android中一般不使用Map,是用Bundle代替Map

          • 自定义数据Modle类
            • 定义继承自Serializable接口的类
            • public class Modle1 implements Serializable {
              
              }
              Intent intent=new Intent(MyActivity.this,TAct.class);
              intent.putExtra("a",new Modle1());

              Serializable接口中已经封装了序列化机制,不需要开发者自己去实现,使用非常简单,但是在Android中不适合使用,其内部一套序列化机制是针对所有类型封装的,是Java提供的一个通用接口,效率较低

            • 定义继承自Parcelable接口的类
            • public class Modle2 implements Parcelable {
                  private String name;
                  public Modle2(String name){
                      this.name=name;
                  }
                  @Override
                  public int describeContents() {
                      return 0;
                  }
                  @Override
                  public void writeToParcel(Parcel dest, int flags) {
                      dest.writeString(this.name);
                  }
                  public static final Creator<Modle2> CREATOR=new Creator<Modle2>() {
                      @Override
                      public Modle2 createFromParcel(Parcel source) {
                          return new Modle2(source.readString());
                      }
              
                      @Override
                      public Modle2[] newArray(int size) {
                          return new Modle2[size];
                      }
                  };
              }

              需要自己实现序列化机制,同时需要创建一个公共静态终态Creator类型成员属性CREATOR,Parcelable是Android提供的一种序列化机制,是完全用于Android开发的,因此效率较Serializable高出很多,通常使用Parcelable来进行自定义类型参数传递

          • 传递参数Intent可以直接传递Bundle,因此一般不需要使用自定义类型参数来传递,Bundle中可以包含任何数据类型,只有当存在通用模板时,为了方便同意维护等才需要使用自定义参数类来实现参数传递
          • Data传递数据
          • intent.setData(Uri.parse("scheme://host:port/path?a=sss&b=adsa"));

            通过intent的Data来传递数据,类似url传参

        • Activity接收数据
          • Extra传递的参数
          • Intent intent=getIntent();
            String s=intent.getStringExtra("aa");
            //或者
            Bundle b=intent.getExtras();
          • 自定义传递参数

          • Intent intent=getIntent();
            Modle1 m= (Modle1) intent.getSerializableExtra("a");
            //或者
            Modle2 modle2=intent.getParcelableExtra("a");
          • Data传递参数

          • Intent intent=getIntent();
            Uri uri=intent.getData();
            String a=uri.getQueryParameter("a");
        • Activity启动模式
          • standard:标准模式,默认模式,Activity注册时不配置android:launchMode参数就表示默认采用standard模式启动,该模式在启动Activity时不会去检查栈中是否已经存在要打开的那个Activity,都会创建一个新的目标Activity实例,然后启动新的实例,就算是自己打开自己,也会生成两个,会执行打开动画
          • singleTop:栈顶模式,当要打开的Activity处于栈顶时,就不会再执行创建实例操作,即不会执行自己打开自己的操作,但是如果不在栈顶,那么不管栈中是否已存在目标实例,都会对目标Activity进行实例化
          • singleTask:单任务模式,任务即栈,使用该模式启动的Activity存在于一个单独的栈中,并不是与主Activity在同一个栈中,而且在启动Activity时会检查是否已存在实例,如果存在不会继续创建新的实例,而是打开原有实例,并且销毁中间的其他Activity实例
          • singleInstance:Activity处于单独的栈中,Activity不能共用一个栈
        • 跨应用启动Activity
          • 跨应用启动Activity无法通过类来创建显示Intent启动
          • 可以使用action隐式启动
          • 可以使用data隐式启动
          • 可以使用setComponent显示启动
          • 需要启动的Activity必须配置android:exported=true属性进行暴漏
        • 浏览器url或超链接启动Activity
          • intent-filter新增一个category参数
          •  <intent-filter>
                   <category android:name="ANDROID.INTENT.CATEGORY.APP_BROWSER"></category>
                   <action android:name="ANDROID.INTENT.ACTION.VIEW"></action>
                   <category android:name="ANDROID.INTENT.CATEGORY.DEFAULT"></category>
              </intent-filter>
          • 将action改为VIEW支持
          • 单独定义url识别
          • <data android:scheme="aa"></data>

            添加协议,路由,ip等,只要满足需求的url都会启动该Activity

          • Activity最终配置成暴漏模式:andropid:exported=true
        • 主Activity配置
          • category配置成LAUNCHER
          • category配置成MAIN
          • <intent-filter>
                    <action android:name="android.intent.action.MAIN"/>
                    <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
原文地址:https://www.cnblogs.com/xl-xlg/p/5028873.html