这里是对Activity一些基础知识的总结,有问题欢迎指正,有遗漏的地方,欢迎补充。
PS:我是现在从事游戏开发,比较喜欢Android,想以后有机会做Android开发!
Activity的生命周期
这里主要是参考了这位同学的博客,然后我本地调试了一下。
public class OurActivity extends Activity {
protected void onCreate(Bundle savedInstanceState);
protected void onStart();
protected void onResume();
protected void onPause();
protected void onStop();
protected void onDestroy();
}
-
onCreate(Bundle savedInstanceState)
Activity处于不可视化,在这个过程中主要是一些数据,视图资源的初始化工作。 -
onStart()
Activity从不可视化到可视化状态的过程,让Activity在后台显示。 -
onResume()
这个方法执行完成以后已经在前台显示,可以进行用户交互。 -
onPause()
Activity正在停止,一般会紧接着onStop()。 -
onStop()
Activity即将停止。 -
onDestroy()
Activity从即将被销毁,可以在这里做一些回收工作和最终资源释放。
- 当Activity切换到桌面再回到Activity:onPause()→onStop()→onRestart()→onStart()→onResume()
当Aty1切换到Aty2过程:onPause_1()→onCreate_2()→onStart_2()→onResume_2()→onStop_1(),这个过程需要注意的就是onPause_1()中不能做耗时操作
当手机横竖屏切换的时候:onPause()→onStop()→onDestroy()→onCreate()→onStart()→onResume()**
销毁:当系统配置发生改变后,Activity会被销毁,其onPause,onStop,onDestroy方法都会调用,由于是异常状态下终止,所以会调用onSaveInstanceState方法来保存当前Activity的状态(视图结构、输入的数据、ListView滚动的位置等);这个方法的调用时机是在onStop之前,可能在onPause之前或之后。
恢复:重新创建时会调用onRestoreInstanceState,把刚刚onSaveInstanceState方法所保存的Bundle对象传递给onRestoreInstanceState和onCreate方法。onRestoreInstance发生在onStart之后。
Activity的加载模式
首先在看加载模式之前,我们需要先了解一下Task和Back Stack。关于这一块的详细讲解请看这位同学的博客,已经分析的相当透彻!
- Task基本工作原理介绍:Task是我们在完成某项工作时所交互的Activity的集合。这些Activity按照打开的顺序被放置在同一个栈中,这个栈被称为Back Stack。当我们点击桌面上的launcher图标时,对应的Task会被置换到前台。如果这个应用不存在Task,就会创建一个新的Task,此时应用的MainActivity就会被创建,压入Back Stack中。当从当前Activity启动到一个新的Activity的时候,新的Activity会被压入栈中,之前的Activity会处于停止状态。当我们按返回键时,新的Activity会被出栈并销毁,之前的Activity会恢复状态。当我们按返回键回到桌面,此时所有的Activity已经出栈,然后Task被销毁。
- 保存Activity的状态:当Activity停止(Stoped)时,系统会默认保存其状态。当我们通过back键返回到这个Activity的时候就会恢复到离开时的界面。当然,也会存在多个Task同时存在的情况,内存紧张时可能会销毁后台的Activity,回收内存。在这种情况下,系统仍然会知道Activity在Task中的位置,当通过back键回到这个Activity时,系统会重新创建一个Activity,而不是之前那种Resume。因此,为了不丢失Activity的内容,可以通过实现onSaveInstanceState()方法主动保存数据,但是值得一提的是onSaveInstanceState()在我们一直按back键退出的时候,是不会调用的,因此一些永久性的数据需要用onPause()方法保存。
加载模式:
- 设置一个launchMode,两种方法:
- 可以直接在AndroidManifest.xml <activity>标签的一个属性中设置launchMode,如下:
<activity
android:name=".SingleTaskActivity"
android:label="singleTask launchMode"
android:launchMode="singleTask">
- 通过叫做 Intent addFlags方法设置更多的行为,比如:
Intent intent = new Intent(StandardActivity.this, StandardActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
- Activity的四种启动模式:
standard:Activity的默认启动方式。启动的Activity都会压进上面所说的Back Stack中。这种方式启动Activity每次都会创建一个新的Activity实例。
singleTop:对应的Flags为FLAG_ACTIVITY_SINGLE_TOP。启动Activity之前,都会先判断Back Stack顶部的Activity是不是要启动的Activity。如果不是,则新创建一个新的Activity。如果是,则直接引用,但是会在Activity启动的时候调用onNewIntent()方法。此时这个Activity生命周期方法为onNewIntent()→onRestart()→onStart()→onResume(),因此如果遇到这种情况,我们应该在onNewIntent()做对应的数据处理方法。但是,需要注意的是系统随时可能杀死后台运行的Activity,如果对应的Activity被杀死了,那么系统就不会调用上面说的onNewIntent(),而是调用onCreate()方法。所以为了保险起见最好在onCreate()中也要有相同逻辑的初始化方法。
singleTask:对应的Flags为FLAG_ACTIVITY_NEW_TASK。如果当前要启动的Activity已经存在于Back Stack中(之前已经创建了一个对应的Activity的实例),会直接使用已经存在的Activity,并且把它上面的活动都给弹出。如果没有则创建一个新的活动实例。
singleInstance:声明为singleInstance的Activity会出现在一个新的任务栈中,而且该任务栈中只存在这一个Activity。除非这个任务栈被销毁了,否则后续的请求均不会创建新的实例。每个Activity都有一个自己的任务栈,除了singleInstance,剩下的启动模式下,Activity都是被保存在了自己App的任务栈里