Android开发艺术探索-读书笔记(一)

第1章 Activity的生命周期和启动模式

1. Activity的生命周期全面分析

  1. onPause必须先执行完,新Activity的onResume才会执行,所以不要做太耗时的工作;
  2. 如果新Activity采用了透明主题,那么当前Activity不会回调onStop;
  3. onSaveInstanceState只会在Activity被异常终止的情况下才会被调用,时间是onStop之前,可能在onPause之前,也可能在之后;
  4. onRestoreInstanceState在onStart之后;onSaveInstanceState保存的参数会传递给onCreate和onRestoreInstanceState,二者的区别是:onRestoreInstanceState一旦被调用,其参数一定是有值的,不用判空;但onCreate不行,如果正常启动的话,其参数为空,所以必须要判空;
  5. 指定configChanges可以阻止系统匹配改变导致的Activity重建;常用的属性有locale,orientation,keyboardHidden,screenSize(API>13);

2. Activity的LaunchMode

  1. standard:标准模式,谁启动就在谁的栈中;ApplicationContext无法启动该模式,因为ApplicationContext没有所谓的任务栈,解决方式为指定FLAG_ACTIVITY_NEW_TASK标记位;
  2. singleTop:栈顶复用模式,如果位于栈顶,不创建新实例,onNewIntent会被调用;
  3. singleTask:栈内复用模式,自带clearTop效果,在所需任务栈中存在,不创建新实例,调用onNewIntent;
  4. singleInstance:单实例模式,singleTask+单独一个栈;
  5. TaskAffinity 任务栈
    1. 与singleTask搭配:Activity运行在名字和TaskAffinity相同的任务栈中;
    2. 与allowTaskReparenting结合:当一个应用A启动了应用B的某个Activity后,如果该Activity指定了该属性为true的话,当B被启动后,该Activity会从A的任务栈转移到B的任务栈;

3. Activity的Flags

  1. FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:具有这个标记的Activity不会出现在历史Activity的列表中,等同于在xml中指定android:excludeFromRecents="true";

4. IntentFilter的匹配规则

  1. IntentFilter中的过滤信息有action、category、data;

  2. 一个过滤规则中可以有多个action,只需要匹配任意一个;

  3. 为了接收隐式意图,必须指定“android.intent.category.DEFAULT”这个category;

  4. data的匹配规则

    1. data的语法:

          
      
    2. Uri的结构:

      ://:/[||]
      

      eg:

      content://com.example.project:200/folder/subfolder/etc
      http://www.baidu.com:80/search/info
      

      Scheme:URI的模式;

      Host:URI的主机名;

      Port:URI中的端口好;

      Path、pathPattern和pathPrefix:路径信息,path表示完整的路径;pathPattern也表示完整的路径,但是里面可以包含通配符"*";pathPrefix表示路径的前缀信息;

  5. 只指定mimeType的Uri有默认值,例如"image/*",默认为content和file;

  6. setData和setType会互相清除,完整的data要调用setDataAndType;

  7. 隐式启动Activity时,调用PackageManager或者Intent的resolveActivity方法,判断是否有匹配的Activity;

    // 返回所有成功匹配的Activity信息
    public abstract List queryIntentActivities(Intent intent, int flags);
    // 返回最佳匹配的Activity信息
    public abstract ResolveInfo resolveActivity(Intent intent, int flags);
    

    上述方法中第二个参数要使用“MATCH_DEFAULT_ONLY”这个标记位,这个标记位的含义是仅仅匹配那些在intent-filter中声明了“android.intent.category.DEFAULT”这个category的Activity,因为不含这个声明的会导致startActivity失败;

你可能感兴趣的:(Android开发艺术探索-读书笔记(一))