第1章 Activity的生命周期和启动模式
1. Activity的生命周期全面分析
- onPause必须先执行完,新Activity的onResume才会执行,所以不要做太耗时的工作;
- 如果新Activity采用了透明主题,那么当前Activity不会回调onStop;
- onSaveInstanceState只会在Activity被异常终止的情况下才会被调用,时间是onStop之前,可能在onPause之前,也可能在之后;
- onRestoreInstanceState在onStart之后;onSaveInstanceState保存的参数会传递给onCreate和onRestoreInstanceState,二者的区别是:onRestoreInstanceState一旦被调用,其参数一定是有值的,不用判空;但onCreate不行,如果正常启动的话,其参数为空,所以必须要判空;
- 指定configChanges可以阻止系统匹配改变导致的Activity重建;常用的属性有locale,orientation,keyboardHidden,screenSize(API>13);
2. Activity的LaunchMode
- standard:标准模式,谁启动就在谁的栈中;ApplicationContext无法启动该模式,因为ApplicationContext没有所谓的任务栈,解决方式为指定FLAG_ACTIVITY_NEW_TASK标记位;
- singleTop:栈顶复用模式,如果位于栈顶,不创建新实例,onNewIntent会被调用;
- singleTask:栈内复用模式,自带clearTop效果,在所需任务栈中存在,不创建新实例,调用onNewIntent;
- singleInstance:单实例模式,singleTask+单独一个栈;
- TaskAffinity 任务栈
- 与singleTask搭配:Activity运行在名字和TaskAffinity相同的任务栈中;
- 与allowTaskReparenting结合:当一个应用A启动了应用B的某个Activity后,如果该Activity指定了该属性为true的话,当B被启动后,该Activity会从A的任务栈转移到B的任务栈;
3. Activity的Flags
- FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:具有这个标记的Activity不会出现在历史Activity的列表中,等同于在xml中指定android:excludeFromRecents=”true”;
4. IntentFilter的匹配规则
- IntentFilter中的过滤信息有action、category、data;
- 一个过滤规则中可以有多个action,只需要匹配任意一个;
- 为了接收隐式意图,必须指定“android.intent.category.DEFAULT”这个category;
data的匹配规则
data的语法:
<data android:scheme="string" android:host="string" android:port="string" android:path="string" android:pathPattern="string" android:pathPrefix="string" android:mimeType="string" />
Uri的结构:
<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]
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表示路径的前缀信息;
只指定mimeType的Uri有默认值,例如”image/*”,默认为content和file;
- setData和setType会互相清除,完整的data要调用setDataAndType;
隐式启动Activity时,调用PackageManager或者Intent的resolveActivity方法,判断是否有匹配的Activity;
// 返回所有成功匹配的Activity信息 public abstract List<ResolveInfo> 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失败;