1.生命周期
- onCreate:正在被创建,通常初始化布局,准备数据。
- onRestart:正在被重新启动,不可见->可见,通常是用户行为(点击home等)
- onStart: 已经显示,但无法交互,还在后台。
- onResume:已经显示,已经显示到前台。
- onPause:当Activity要跳到另一个Activity或应用正常退出时都会执行这个方法。此时Activity在前台并可见,我们可以进行一些轻量级的存储数据和去初始化的工作,不能太耗时,因为在跳转Activity时只有当一个Activity执行完了onPause方法后另一个Activity才会启动,如果onPause在500ms即0.5秒内没有执行完毕,强制关闭Activity。
- onStop:即将停止,已经不可见,可做轻量级回收。
- onDestroy: 表示被销毁,可以做回收和资源释放。
几种情况:
- 打开新的Activity或切换桌面:onPause->onStop
- 返回Activity: onRestart->onStart->onResume
- 启动新的Activity:先调用旧的onPause,然后启动新的页面
- 切换屏幕:onSaveInstanceState->onCreate->onRestoreInstanceState,onPause,onStop,onDestroy也会被调用。恢复的数据从onCreate和onRestoreInstanceState的bundle去找,onCreate的bundle判断是否为空,系统自动还原某些数据,比如text。
- Activitiy的优先级:高->低
(1)前台Activity
(2)被dialog挡住的无法交互的前台
(3)后台Activity - 不想让Activity重新创建,设置android:configChanges=''orientation|ScreenSize''
2.启动模式
1. standard:标准模式
普通的stack结构,A->B会将B放入A所在的栈。如果用ApplicationContext启动会报错,因为ApplicationContext没有所谓的任务栈。解决方法:改为singleTask模式。
2. singleTop:栈顶复用。如果在栈顶,那么将不会重新创建。
栈:ABCD,启动D,还是ABCD,如果是standard,则变为ABCDD。
3. singleTask:栈内复用。
描述:启动A,如果存在A所需任务栈,如果不存在,创建任务栈并把A放入。如果存在,A在栈中,则把A调用到栈顶(clearTop),如果不存在A则,把A放到栈顶。
举例:
- S1:ABC,D需要S2,则S1:ABC,S2:D
- S1:ABC,D需要S1,则S1:ABCD
- S1:ADBC,D需要S1,则S1:AD(clearTop)
4. singelnstance
每个创建都位于单独栈,如果重复创建,则栈内复用,除非栈被销毁。属于加强的singleTask。
指定启动模式的方法:
- 通过androidManifest.xml指定:
<activity
android:launchMode="singleTask" //指定模式
android:taskAffinity="com.ryg.task" //指定任务栈
/>
2.通过Intent
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
区别:
(1) 优先级:1<2 。同时存在,以第二种为准。
(2)限定范围:1不能指定FLAG_ACTIVITY_CLEAR_TOP 2.无法指定singleInstance