第1章
1.onStart和onStop是从Activity是否可见这个角度来回调的,而onResume和onPause是从Activity是否位于前台这个角度来回调的,除了这种区别,这两组方法在审计局使用中没有其他明显区别。
2.在新的Activity启动之前,栈顶的Activity需要先onPause后,新Activity才能启动。
3.当新启动一个Activity的时候,旧Activity的onPause会先执行,然后才会启动新的Activity。
4.当Activity在异常情况下终止,系统会调用onSaveInstanceState来保存当前Activity的状态。这个方法的调用的时机是在onStop之前。当Activity被重新创建后,系统会调用onRestoreInstanceState,并且把Activity销毁时onSaveInstanceState方法所保存的Bundle对象作为参数同时传递给onRestoreInstanceState和onCreate方法,从时序上来说,onRestoreInstanceState的调用时机在onStart之后。
5.Activity中有一个configChanges属性:
android:configChanges="..."
如果我们没有在Activity的configChanges属性中指定相应的选项的话,当配置发生改变后就会导致Activity被重新创建。
6.四种启动模式:
(1)standard:标准模式,这也是系统的默认模式。每次启动一个Activity都会重新创建一个新的实例,不管这个实例是否已经存在。
(2)singleTop:栈顶复用模式。在这种模式下,如果新的Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时它的onNewIntent方法会被回调,通过此方法的参数我们可以取出当前请求的信息。如果新的Activity的实例已存在但不是位于栈顶,那么新Activity仍会重新创建。
(3)singleTask:栈内复用模式。这是一种单实例模式,在这种模式下,只要Activity在一个栈中存在,那么多次启动此Activity都不会重新创建实例,和singleTop一样,系统也会调用其onNewIntent。standard模式的Activity默认会进入启动它的Activity所属的任务栈中。
(4)singleInstance:单实例模式。这是一种加强的singleTask模式,它除了具有singleTask模式的所有特性外,还加强了一点,那就是具有此中模式的Activity只能单独地位于一个任务栈中。
7.TaskAffinity属性标识了一个Activity所需要的任务栈的名字,默认情况下为应用的包名。主要和singleTask启动模式或者allowTaskReparenting属性配对使用。另外,任务栈分为前台任务栈和后台任务栈,后台任务栈中的Activity位于暂停状态,用户可以通过切换将后台任务栈再次调用道前台。
8.启动Activity分为两种,显式调用和隐式调用。显式调用需要明确地指定被启动对象的组件信息,包括包名和类名,而隐式调用则不需要明确指定组件信息。
9.隐式调用需要Intent能够匹配目标组件的intent_filter中所设置的过滤信息,如果不匹配将无法启动Activity。过滤信息有action、category、data。
10.只有一个Intent同时匹配action类别、category类别、data类别才算完全匹配。一个Activity中可以有多个intent_filter,一个Intent只要能匹配任何一组intent_filter即可成功启动对应的Activity。
11.对于data,如果要为Intent指定完整的data必须要调用setDataAndType方法,不能先调用setData再调用setType,因为这两个方法彼此会清除对方的值。
12.当我们通过隐式调用启动一个Activity的时候,可以做一个判断,看我们的Activity是否匹配我们的隐式Intent,如果不做判断就有可能出现无法找到Activity的错误。判断方法:采用PackageManager的resolveActivity方法和queryIntentActivities方法或者Intent的resolveActivity方法,如果它们找不到匹配的Activity就会返回null,我们通过判断返回值旧可以规避上述错误。
13.resolveActivity和queryIntentActivities的方法原型是:
public abstract List<ResolveInfo> queryIntentActivities(Intent intent, int flags);
public abstract ResolveInfo resolveActivity(Intent intent, int flags);
第二个参数我们要使用MATCH_DEFAULT_ONLY这个标记位。如果不用这个标记位,就会把intent-filter中category不含DEFAULT的那些Activity给匹配出来,从而导致startActivity可能失败。因为不含有DEFAULT这个category的Activity是无法接收隐式Intent的。