四大组件之Activity 第6节 Activity启动模式

更新时间 修改意见
2016-08-02 陈敏

第6节 Activity启动模式

Activity的启动模式,就是指当用户或者系统启动一个Activity时,将这个Activity如何放到Task中进行管理。

Activity有四种启动方式:standard、singleTop、singleTask、singleInstance。

6.1 standard模式

这是每个Activity默认的启动模式,如果我们没有在manifest中指定,那么Activity启动就会采用这个模式。这个模式很简单,原则只有一个:当启动这种类型的Activity时,每次创建一个全新的Activity,然后将它放在当前Task栈的栈顶。

进一步举个例子:Activity A上,有一个按钮,点击后,可以再启动一个Activity A。这时我们看到的Task堆栈情况就是,Activity A上又创建了一个Activity A。这两个Activity都是Activity A的实例,是互相独立的Activity,在内存中有各自的一块区域。

6.2 singleTop模式

这个启动模式的原则是:当启动这个类型的Activity时,如果这个Activity有实例在当前Task中存在,并且位于这个Task的栈顶,那么就触发Activity的onNewIntent()方法通知一下,而不用重新创建;

否则,即使这个Task中有这个Activity实例,只要它不在栈顶,就重新创建;


使用场景:一个新闻客户端会接收新闻推送,在statusbar上显示已经收到10条推送了。当我们点击第一条的时候,启动一个显示新闻内容的Activity-ContentActivity,当我们点击statusbar上的第二条新闻时,再次启动ContentActivity。如果ContentActivity是standard模式,可以想见,在之前的新闻内容上,又回弹出一个Activity,10条推送点击十次,就会有10个Activity叠在一起。

麻烦的是返回时得按10次,而且会占用很多系统资源。

如果将ContentActivity指定为singleTop,那么点击后面9条推送时,ContentActivity只会通过onNewIntent()知道有新的调用请求,不必重新创建9个Activity实例过份消耗资源。

6.3 singleTask模式

这个启动模式的原则是:当启动这个类型的Activity时,先查看这个Activity是否有实例在系统当前的Task中存在。

6.3.1 前台Task中存在

如果它在位于前台的task中存在,并且位于这个Task的栈顶,那么就调用onNewIntent()通知一下,而不用重新创建--这一点与singleTop模式类似;

如果存在,但是不在Task的栈顶,就将这个Activity上面别的Activity全部弹出、销毁,把这个Activity的实例放到最上面,再用onNewIntent()通知它一次。

6.3.2 后台Task中存在

如果它在位于后台的task中存在,就把后台task放到前台来,然后把它上面存在的别的Activity弹出、销毁。


使用场景:应用的主Activity A,可以启动Activity B, Activity B又能启动Activity C,C又能启动D,设计者希望从D能够直接返回到主Activity A。

对于这种希望在任意层级的Activity下,快速返回到主界面的应用,就可以把主Activity A设置成singleTask模式。

6.4 singleInstance模式

这个启动模式的原则是:当启动这个类型的Activity时,如果该Activity之前并不存在,就会重新创建一个Task,并把该Activity放入其中。假如这个Activity要启动别的Activity-C(一个standard的Activity),那么就会将Activity-C放在之前那个Task中。

如果该Activity已经存在,就把该Activity所在的task切换到前台来。
总之,一个task中有且只有一个这种类型的Activity。


使用场景:对于那种需要提供给第三方调用的Activity,例如微信的分享、转发,就可以把这种Activity设置成singgleInstance。这样在系统范围内保证只有一个这样的Activity存在。


/**************************************************************************/
* 版权声明
* 本教程只在CSDN安豆网发布,其他网站出现本教程均属侵权。
/
**************************************************************************/