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代替Mapandroid

          • 自定义数据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();
          • 自定义传递参数app

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

          • 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>
相关文章
相关标签/搜索