Activity总结
Activity生命周期
Activity生命周期图示BACK键:
当我们按Back键时,我们这个应用程序将结束,这时候将先后调用onPause()->onStop()->onDestory()三个方法。
再次启动App时,会执行onCreate()->onStart()->onResume()
HOME键:
当我们按HOME的时候,Activity先后执行了onPause()->onStop()这两个方法,
这时候应用程序并没有销毁。而当我们从桌面再次启动应用程序时,则先后分别执行了onRestart()->onStart()->onResume()三个方法
注意:当Activity在后台时候,如果系统内存不够用,后台的Activity很有可能会被强制销毁回收内存的,那么一定会触发onSaveInstanceState(Bundle outState) 方法,我们可以把想保存的数据保存在 outState对象里,等Activity被重新创建执行onCreate(Bundle saveInstanceState) 从参数saveInstanceState再读取保存的数据
ActivityA 打开 ActivityB
Paste_Image.png根据上图 可以看出,正常情况下依次是
- A:onPause()
- B:onCreate()
- B:onStart()
- B:onResume()
- A:onStop()
但是,如果ActivityB的样式是Dialog样式,B没有完全遮挡A,ActivityB的生命周期跟刚才一样,但是ActivityA并没有执行onStop()
从ActivityB 返回 ActivityA
接着上面的,如果在处于ActivityB 界面按下back键,返回 ActivityA,生命周期如下:
Paste_Image.png依次会执行:
- B:onPause()
- A:onRestart()
- A:onStart()
- A:onResume()
- B:onStop()
- B:onDestory()
Activity启动模式
- Standard模式(默认)
每次开启,都会在任务栈中创建新的Activity实例 - SingleTop模式
如果当前待开启的Activity正好位于栈顶,就复用,否则在任务栈中创建新的Activity实例 - SingleTask模式
如果当前待开启的Activity已经存在,无论在栈中任何位置,都会将此位置上面的Activity全部移除,然后复用该Activity - SingleInstance模式
一个任务栈中只有一个Activity,并保证不再有其他
onNewIntent
当Activity不是Standard模式,并且被复用的时候,会触发onNewIntent(Intent intent) 这个方法,一般用来获取新的Intent传递的数据
我们一般会把MainAcitivy设置为SingleTask,除了保证MainActivity的唯一,还可以利用singleTask的特性做一些清理工作。自动管理栈,销毁无用的Acitivity.
Intent Flags
记住一点:Activity都是运行在任务栈里面,但如果要从广播接受者BordercastReceiver或者服务Service去启动一个Activity,必须为当前Activity创建一个新的任务栈才能正常显示
public class MyReceiver extends BroadcastReceiver{
public void onReceive(Context context, Intent intent) {
Intent intent=new Intent(context,DemoActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//创建新的任务栈
context.startActivity(intent);
}