(图片来自网络,侵删)
onStart和onStop对应,他们的区别在于Activity是否可见。onResume和onPause对应,区别在于Activity是否在前台显示。
onPause如果执行太多的操作会影响新的onResume的显示。onPause必须执行完新的Activity的onResume才会显示。
如果新的Activity采用透明的主题,则之前的Activity不会执行onStop。因为它还是可见的。
当Activity在异常情况下终止时,会调用onSaveInstanceState来保存当前Activity的状态。当此Activity重新创建后,在onStart后会调用onRestoreInstanceState来把之前销毁的信息传回来。
如果资源内存不足,优先级低的Activity会被杀死。其中,正在与用户交互的前台Activity的优先级最高,其次,该Activity还在可见状态但是位于后台,比如弹出一个对话框。最后在后台的Activity 已经被暂停的Activity 已经执行了onStop的Activity.他们的优先级最低。
Activity的启动模式
任务栈是一个“后进先出”的栈结构,每次finish()初一前台的Activity就会出栈。当栈中没有Activity时,系统回回收这个任务栈。
standard: 默认的标准模式,每次启动都会创建一个新的实例,谁启动了这个Activity,这个Activity就在启动它的那个Acivity所在的任务栈中。档用ApplicationContext去启动standard模式的Activity会报错,因为standard模式的Activity会默认进入启动它的Activity所在的任务栈中,而非Activity类型的Context并没有任务栈。解决办法是为这个待启动的Activity指定FLAG_ACTIVITY_NEW_TASK标记,这样就会为它创建一个新的任务栈。
singleTop: 栈顶复用,如果新的Activity已经位于栈顶,那么这个Activity不会被创建,同时它的onNewIntent方法会被回调而onCreate和onStart不会被调用,如果新的Activity存在但是并不位于栈顶,那么新的Activity依然会重新被创建。
singleTask:栈内复用,这是一种单例模式,该模式下,Activity只要在一个栈中存在,那么,启动该Activity都不会重新创建实例。和singleTop一样会回调onNewIntent。如果启动的Activity没有锁需要的任务栈,那么会先创建任务栈再创建Activity。singleTask默认具备clearTop的效果,具有该模式的Activity会让在它上面的Activity全部出栈。
singleInstance:单实例模式,这是一种加强的singleTask模式,除了具备singleTask的特性之外,具有该模式的Activity只能单独位于一个任务栈之中。创建的时候会为这个Activity创建一个新的任务栈并且后续的启动都不会创建新的Activity,除非这个任务栈被系统销毁了。
启动模式可以通过在配置清单文件里指定 launchMode=”single…”来实现。也可以通过Intent在代码中设置标记位指定Activity的启动模式
Intent intent=new Intent(this,MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
第二种代码书写的方式优先级高于第一种方式,如果都设置了的话,第二种会生效。
第一种清单文件方式不能直接为Activity设置FLAG_ACTIVITY_CLEAR_TOP标记,而第二种方式无法为Activity指定singleInstance。
通过adb shell dumpsys activity命令可以详细了解当前任务栈情况。