1.生命周期
35b59f8a5edd806c9f5fe572c9553cd.png2.特殊情况下的生命周期
-
横竖屏切换
onSavaInstanceState和onRestoreInstanceState。
在activity异常终止的情况下。系统会调用onSaveInstanceSate来保存当前 状态的Activity状态, 这个方法只会在被异常终止情况下调用。当异常终止的 activity被重建的时候,系统会调用onRestoreInstanceState方法,把保存的boundle传递给onRestoreInstanceState和oncreat方法。
横竖屏切换的生命周期: onPause()->onSaveInstanceSate()->onStop()->onDestroy()->onCreat()-> onStart()->onRestoreInstanceState()->onResume(),可以在AndroidManifest文件的activity中指定如下属性来避免横竖屏切换的时候,activity的销毁和重建。
Android:configChanges = "orientation|screenSize"
-
资源内存不足导致优先级低的activity被杀死
- 前台activity----正在和用户交互的activity,优先级最高
- 可见的但非前台Activity----比如activity中弹了一个对话框,导致Activity可见但是位于后台无法和用户交互。
- 后台Activity----已经被暂停了的Activity,比如执行了onStop,优先级最低。
当系统的内存不足的时候,会按照上述优先级从最低到高去杀死目标activity所在的进程。生命周期同上。
3. 启动模式
-
标准模式(standard)
绝大多数的Activity,每次启动一个Activity,就会创建Activity实例并置于栈顶。 谁启动了这个activity,那么这个实例,就运行在启动它的那个Activity栈顶。
特殊情况: 如果,在Service或者Application中启动一个Activity,其没有所谓的任务栈,可以使用标记位Flag来解决。为待启动的Activity指定FLAG_ACTIVITY_NEW_TASK。 -
栈顶复用模式(singleTop)
如果需要新建的Activity位于任务栈的栈顶,那么此Activity不会重建,而是直接复用栈顶的实例,并且回调如下方法:
应用场景:显示通知信息。
@override
protected void onNewIntent ( Intent intent ) {
super.onNewIntend(intent);
}
3.栈内复用模式(singleTask)
该模式是一种单例模式,即一个任务栈中只有一个该Activity实例,该模式,可以通过AndroidManifest文件的Activity中指定该Activity需要加载到指定的任务栈中。如果指定的任务栈位于栈顶直接复用,如果位于栈内,会直接将其上方的所有Activity清除出栈。
应用场景: 大多数App的主页。
<activity android:name=".Activity1"
android:launchMode="singleTask"
android:taskAffinity="com.lvr.task" //指定的任务栈
android:label="@string/app_name">
</activity>
-
单例模式(singleInstance)
作为栈内复用模式的加强版,打开该Activity时,直接创建一个新的任务栈,并把该实例放置在栈中。一旦该模式的Activity实例已经存在某个任务栈中,任何应用再激活该Activity时都会复用该栈中的实例。
应用场景:呼叫来电模块。
4. Activity的Flags
- FLAG_ACTIVITY_NEW_TASK 其效果与指定Activity为singleTask模式一致。
- FLAG_ACTIVITY_SINGLE_TOP 其效果与指定Activity为singleTop模式一致。
- FLAG_ACTIVITY_CLEAR_TOP 具有此标记位的Activity, 当它启动时, 在同一个任务栈中所有位于它上面的Activity都要出栈。
网友评论