Activity是我接触Android开发时候所接触的第一个”词”当初直接根据英语意思翻译成”活动”,现在想想其实理解成”界面”才是最准确的。众所周知,每一个Activity都有它自己的生命周期下面是一张非常经典的图解释了Activity的”生老病死”。
第一:Activity的生命周期
Activity启动-onCreate-onStart-onResume-onPause-onStop-onDestory-Activity销毁,这是每一个Activity非常正常的生命流程当然我们的app是不可能只有这么一个Activity所以在切换的过程中就会引起不同的生命周期。如果跳转到一个新界面就会调用onPause-onStop返回的时候就会跳转到onRestart-onStart-onResume。
注意点:
1.如果新Activity是透明主题 那么当前的Activity不会调用onStop方法
2.新Activity需要等待onPause完成才会启动所以不宜在onPause执行耗时的操作避免启动新Activity比较延迟,影响体验
3.onStart和onResume都是当前Activity已经可见的时候才调用,不同点是onStart时Activity还在后台onResume的时候已经在前台显示了
第二:Activity销毁重建
我们看到上面的图会发现左边的那个生命流程,这个流程是当前的Activity由于系统资源不足或者系统配置发生变动的时候会走这个流程:onStop-onSaveInstanceState-onCreate-onResoreInstanceState
其中常见都系统资源不足常见的情况有
1.系统横竖屏切换
2.设备的本地位置发生改变,多指语言发生改变
当我们android:configChanges=”xxx”配置之后那么就不会调用onSaveInstanceState、onResoreInstanceState来处理数据从而替换的是onCinfigurationChanged来处理这种特殊情况
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.w(TAG, "--- onSaveInstanceState ---");
outState.putString("content", mEditText.getText().toString());
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.w(TAG, "--- onRestoreInstanceState === " + savedInstanceState.getString("content"));
}
上面的代码我们就能用来简单保存当发生变化的时候整体的流程,只是需要注意的是savedInstanceState在onRestoreInstanceState和在onCreate中的不同点:onCreate在第一次启动的时候savedInstanceState为空其他的时候都是一样的。
第三:Activity的启动模式
1.standard启动模式
这种启动模式是Activity的标准模式也是默认的启动模式,假设现在task中的有AB两个Activity,在B其中A 那么就会变成ABA,在B中启动B就会变成ABB。所以这种模式每次启动一个standard的Activity那么该Activity就会默认进入启动Acvitity的task中去。
2.singleTop启动模式
如果一个singleTop的Activity当他处于任务task的栈顶的时候那么就不会再次启动一个新的Activity,比如ABC且C位于顶部再次启动C的时候任务task中仍然为ABC但是会C这个Activity会执行onNewIntent方法,当然如果不在当前任务栈或者不为栈顶的时候就会重新创建一个新的Activity且加入这个任务task栈顶且是一个全新的Acitity不会执行onNewIntent这个方法。
3.singleTask启动模式
一个singleTask的Activity在一个任务栈中只会存在一个该Activity不会存在多个,它首先是查询该Activity所需要的栈是否存在如果不存在会先创建该栈再把Activity加入该栈中,如果已经存在那么直接移除该Activity之上所有的Activity似自己处于栈顶。
比如说:现在是ABCD如果我们启动一个D的时候由于已经处于栈顶那么直接执行onNewIntent方法且任务栈仍然为ABCD,而如果我们启动的是B那么最终的任务栈内为AB。
4.singleInstance启动模式
singleInstance模式是增强版的singleTask它处于一个独立的task中,如果启动了那么它就会加入启动它的那个Activity中并处于栈顶,其他的跟singleTask一样的流程。
<activity
android:name=".InfoActivity"
android:launchMode="singleTask"
android:taskAffinity="com.single.task"/>
上面的代码片段简单介绍了如何给一个Activity配置启动模式,当然我们也可以从代码中配置如intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)。我们注意到了android:taskAffinity这个是用于配置当前的Activity要处于哪个任务栈默认的情况下taskAffinity是应用的包名通常我们设置成一个包名但是如果跟app的包名一样的话就没有作用了。
这样对Activity的纹络就非常清晰的感觉了 ~
参考文献:http://droidyue.com/blog/2015/08/16/dive-into-android-activity-launchmode/