Activity启动模式
(1)standard:标准模式 每次启动一个Activity都会重新创建新的实例,不管这个实例是否已经存在。在这种模式下,谁启动了这个Activity,这个Activity就会运行在启动它的那个Activity所在的栈中(前一个activity模式是singleInstance除外)。
*注意事项*
当我们用非Activity类型的Context(A)去启动标准模式的Activity(B)时,需要为B指定FLAG_ACTIVITY_NEW_TASK标记为,这是因为A并没有所谓的任务栈。这样启动的Activity是以singleTask模式启动的。
(2)singleTop:栈顶复用模式。如果新Activity位于栈顶,那么不会被重新创建,同时会回调onNewIntent方法。
(3)singleTask:栈内复用模式。Activity只要在栈中存在,就不会重新创建实例,并回调onNewIntent方法。此模式默认具有clearTop效果。
(4)singleInstance:单实例模式。这是一种加强的singleTask模式,具有singleTask的所有特性。只能单独位于一个任务栈中。
TaskAffinity 这个参数标识了一个Activity所需要的任务栈的名字,默认为应用包名。TaskAffinity属性主要singleTask启动模式或者allowTaskReparenting属性配对使用。其他情况下没有意义。
指定启动模式有两种方式,1 在AndroidMenifest中直接指定2通过代码设置(intent.addFlags())。这两种方式区别是,第二种优先级更高一些,当两种方式都存在时,以第二种方式为准;限定范围不同:第一种无法直接为Activity设置FLAG_ACTIVITY_CLEAR_TOP标识,第二种方式无法为Activity指定singleInstance模式。
Activity的Flags
FLAG_ACTIVITY_CLEAR_TOP
具有此标记的activity,当它启动时,在同一个任务栈中所有位于它上面的activity都要出栈,一般要和FLAG_ACTIVITY_NEW_TASK配合使用。如果要启动的activity采用standard模式,那么它连同它之上的activity都要出栈,系统会放入新的activity实例并放入栈顶。
FLAG_ACTIVITY_NEW_TASK
为Activity指定“singleTask”启动模式
FLAG_ACTIVITY_NEW_TOP
为Activity指定“singleTop”启动模式
旋转屏幕时Activity不重新创建的方法
1.如果minSdkVersion和targetSdkVersion有一个大于13,需要如下配置:
android:configChanges="orientation|screenSize"
2.直接配置横屏或者竖屏
android:screenOrientation="portrait"
Activity数据保存
Activity异常情况下被终止,系统会调用onSaveInstanceState保存当前activity的状态,这个方法的调用是在onStop之前,可能在onPause之前,也可能在onPause之后。恢复数据是在onRestoreInstanceState方法,这个方法的调用是在onStart之后。view自身会保存数据状态,但是要确保每个view的id是唯一的。
IntentFilter匹配规则
action:Intent中的action能够和过滤规则中的任何一个action相同即可匹配成功。
category:Intent可以没有category(会默认为Intent加上android.intent.category.DEFAULT),如果一旦有,每个category都要和过滤规则中的任何一个category相同。
读书笔记《Android开发艺术探索》