1, Activity 生命周期
1.1 Activity生命周期图
如下:
Activity生命周期流程图.png
1.2 Activity流程中疑难点
- 正常流程中,当打开另一个新的Activity或者按下Home键当前Activity会走onPause--onStop,如果新的Activity是透明主题则只会调用onPause不会调用onStop
- onStart和onStop是从Activity是否可见的角度区分的;onResume和OnPause从界面是否在前台的角度区分的
- onResume和OnPause时Activity界面可操作,onStart和onStop界面不可操作
- 如果当前activityA打开新的activityB时执行流程是 A(onPause)--B(onCreate)--B(onStart)--B(onResume)--A(onStop)而不是A(onPause)--A(onStop)......B
1.3 Activity异常情况
<1,当activity异常终止时,系统提供了存储和恢复的方法,流程如下
异常终止流程
<2,具体实现
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("test_key","test_value");
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
String test_value = savedInstanceState.getString("test_key");
}
}
<3,系统本身就自动做了一定的恢复工作,比如:保存当前activity视图;textview的内容;listview滚动位置等,这些的实现是因为这些View本身实现了,比如TextView
onSaveInstanceState()
onRestoreInstanceState()
异常情况如下
- 1.3.1 系统配置发生改变导致activity被杀死并重建
<1. 当手机屏幕方向发生改变时,如果没有进行特殊配置
如果不想让activity因系统配置发生改变,可如下配置
<activity
android:name=".TestActivity"
//忽略屏幕方向|软键盘隐藏|屏幕尺寸变化
android:configChanges="orientation|keyboardHidden|screenSize"
//确定该activity方向为纵向
android:screenOrientation="portrait"
/>
- 1.3.2 资源内存不足优先级较低的activity被杀死
<1. 前台activity--正在和用户交互的activity,优先级最高.
<2. 可见但非前台--如activity上弹出dialog
<3. 后台activity--如已执行过onStop的activity
2, Activity 启动模式
- 基本概念
任务栈 : 后进先出的栈结构,当创建activity后,系统会把activity放进栈中,当用户按下back键后任务栈中activity会一一回退,直到任务栈中activity被清空,任务栈为空后,系统会回收该任务栈
- 启动模式
activity启动模式:
<1.standard:标准模式
<2,singleTop:栈顶复用模式
<3,singleTask:栈内复用模式
<4,singleInstance:单实例模式
- 根据activity定制任务栈
默认新建的activity存放的任务栈是app的包名,但是可以自定义任务栈如下:
<activity
android:name="TestActivity"
android:taskAffinity="com.test.myApp"<这个是包名>
/>
<activity
android:name="TestActivity1"
android:taskAffinity="com.test.myApp_t1"<这个是定制的任务栈名称>
/>
- 注意事项
- 启动模式也是针对任务栈而言的,如果是不同的任务栈,诸如singleTop,singleTask,就不再生效
- 当我们使用ApplicationContent 去启动activity时,系统会报错
Calling startActivity() from outside of an Activity context requires the
FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
原因是新建一个activity,没有指定一个任务栈,所以加上FLAG_ACTIVITY_NEW_TASK 之后,指定新建一个任务栈,可以存放activity
2.1指定activity启动模式
- standard(标准模式)
默认情况下不做任何操作,就是该模式 - singleTop(栈顶复用模式)
1,manifest文件中
<activity
android:name="TestActivity"
android:launchMode="singleTop"
/>
2,标识位标识
Intent intent = new Intent(context,TestActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP );
startActivity(intent);
- singleTask(栈内复用模式)
1,manifest文件中
<activity
android:name="TestActivity"
android:launchMode="singleTask"
/>
2,标识位标识
Intent intent = new Intent(context,TestActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
- singleInstance(单实例模式)
manifest文件中
<activity
android:name="TestActivity"
android:launchMode="singleTask"
/>
网友评论