Activity是安卓的四大组件之一,Activity的生命周期也同样重要,这里我就自己总结了一下,学习用的,第一次写,肯定会有不足。
首先是两个界面,一个MainActivity,另一个SecondActivity,现在让第一个Activity跳到第二个,再返回到第一个,看一下生命周期:
onResume可见有交互。
首先,onCreate创建第一个Activity——onStart开始第一个Activity——onResume获取第一个界面的用户焦点——开始第二个Avtivity,第一个活动onPause失去焦点——onCreate第二个Activity启动——onStart第二个Activity开始——onResume第二个界面获取焦点——第一个Activity的界面停止onStop——第二个界面暂停onPause——第一个界面重新启动onRestart——第一个界面开始onStart——第一个界面恢复焦点onResume——第二个界面停止onStop——第二个界面被销毁onDestroy。
Activity的启动模式:
Activity一共有四种启动模式:standard、singleTask、singleTop、singleInstance。
standard:这是Activity默认的启动模式,原则很简单,就是每创建一个新的Activity时,都会讲这个Activity放到Task栈的栈顶。
singleTask:前台Task中存在:如果它在位于前台的Task中存在,并且位于这个Task的栈顶,那么就调用onNewIntent()通知一下,而不用重新创建--这一点与singleTop模式类似;
如果存在,但是不在Task的栈顶,就将这个Activity上面别的Activity全部弹出、销毁,把这个Activity的实例放到最上面,再用onNewIntent()通知它一次。
后台Task中存在:如果它在位于后台的Task中存在,就把后台Task放到前台来,然后把它上面存在的别的Activity弹出、销毁。
singleTop:这个启动模式的原则是,当启动这个类型的Activity时,如果这个Acticity有实例在当前的这个Task中存在,并且位于栈顶的时候,那么,就触发Activity的onNewIntent()方法通知一下,而不用重新创建。否则,即使这个Task中有这个实例,如果它不在栈顶,就会重新创建。
使用场景:一个新闻客户端会接收新闻推送,在statusbar上显示已经收到10条推送了。当我们点击第一条的时候,启动一个显示新闻内容的Activity-ContentActivity,当我们点击statusbar上的第二条新闻时,再次启动ContentActivity。如果ContentActivity是standard模式,可以想见,在之前的新闻内容上,又回弹出一个Activity,10条推送点击十次,就会有10个Activity叠在一起。麻烦的是返回时得按10次,而且会占用很多系统资源。如果将ContentActivity指定为singleTop,那么点击后面9条推送时,ContentActivity只会通过onNewIntent()知道有新的调用请求,不必重新创建9个Activity实例过份消耗资源。
singleInstance:总是在新的任务中开启,并且这个新的任务中有且只有这一个实例,也就是说被该实例启动的其他activity会自动运行于另一个任务中。当再次启动该activity的实例时,会重用已存在的任务和实例。并且会调用这个实例的onNewIntent()方法,将Intent实例传递到该实例中。和singleTask相同,同一时刻在系统中只会存在一个这样的Activity实例。