Activity的四种启动模式

来源:互联网 发布:原子力显微镜知乎 编辑:程序博客网 时间:2024/06/08 15:51

Activity的launchMode一共有四个可选值:standard、singleTop、singleTask和singleInstance

四者的概念:

1. Standared模式(默认)

默认的Activity启动方式,这种模式的Activity的特点是:只要你创建了一个该Activity的实例并处于活动状态,就会向任务栈(task)顶加入这个新创建的实例,无论当前任务栈中是否已经有同样的该Activity实例。退出该Activity时会在任务栈顶弹出该实例。

 

2. SingleTop模式

这种模式的Activity特点是,当要创建的新的Activity实例,已经在任务栈中存在并正处于栈顶,则这个新的Activity实例不会被创建,而是重用当前处于任务栈顶端的那个Activity实例并调用一下栈顶Activity实例的onNewIntent方法。如果同样的Activity虽然在任务栈中存在,但是此时并不处于任务栈顶,那么就会创建新的Activity实例并放在任务栈顶端。

 

3. SingleTask模式

这种模式的Activity特点是,当要创建的新的Activity实例时,如果任务栈中已经存在该模式的Activity实例,则这个新的Activity实例不会被创建,而是把栈中同样实例以上的所有Activity实例全部移除后将那个同样的Activity实例置于任务栈的顶端,此时除了会调用栈中这个Activity的相关生命周期方法外,还会调用这个Activity的onNewIntent方法。如果任务栈中不存在同样的Activity,就重新创建一个新的Activity实例并放在任务栈顶端。

 

4. SingleInstance模式

这种模式的Activity特点是,当该模式Activity实例在任务栈中创建后,它会独占一条任务栈。如果要重复创建该Activity实例,每次只是激活已经存在的该类型Activity,并且会调用该Activity的onNewIntent方法。此模式一般用于加载较慢的,比较耗性能且不需要每次都重新创建的Activity。

然后看一下具体的示例:

假设有3个Activity,分别为A,B,C。A为主启动Activity,A中有2个按钮,分别用来启动B和C;B中有2个按钮,分别用来启动B(即自己启动自己)和C,C中有一个按钮用来启动A。

当我设置B的模式为standard的时候,我依次做如下的启动操作A->B->B->A,栈中的Activity会有四个,且从栈底到栈顶的顺序就是A->B->B->A

当我设置B的模式为singleTop的时候,我依次做如下的启动操作A->B->B->A,栈中的Activity会有三个,且从栈底到栈顶的顺序就是A->B->A;原因是,第二次操作从B中启动B的时候,因为B已经在栈顶,所以不会再启动另外一个B,只会调用一下B的onNewIntent方法。

但是我更改一下启动顺序为A->B->A->B,此时栈中的Activity会有四个,且从栈底到栈顶的顺序就是A->B->A->B;

当我设置B的模式为singleTask的时候,我依次做如下的启动操作A->B->A->C->A->B,此时栈中的Activity只会有2个,从栈底到栈顶的顺序是A->B。原因是当第五次操作从A启动B的时候,因为任务栈中已经有B,所以会把当前任务栈中B上面的由下到上的A、C、A三个Activity全部弹出销毁,并将那个B置于栈顶端。B在回到栈顶端的过程中会回调onRestart-->onStart-->onResume生命周期方法,同时还会回调自己的onNewIntent方法。

当我设置B的启动模式为singleInstance的时候,我依次做如下的启动操作A->B->A->C->A->B,此时会有两个任务栈,栈1中由下到上依次存放的Activity是A->A->C->A,栈2中有一个Activity就是B。原因是,当程序启动时,A作为主启动Activity会开辟一个任务栈(称其为栈1),当A启动B时,会再为B单独开启一个任务栈(称其为栈2)并将B放入,当B启动C时,会将C放入栈1中,随后C启动A也是再栈1中,A再次启动B时,会激活栈2中已经存在的B,此时B会成为屏幕上与用户交互的Activity,并且B的onNewIntent方法会被调用。

最后说一下在一个Activity中按下Back键和按下Home键时会执行的生命周期方法:

按下Back键,意味着当前Activity的销毁,所以执行的生命周期方法依次是:onPause-->onStop-->onDestroy

按下Home键,返回到主屏幕,当前Activity并不会销毁,但是也不可见了。所以执行的生命周期方法依次是:onPause-->onStop,当用户通过某种方式返回到该app时,该Activity会重新回到活动状态,所以执行的生命周期方法依次是:onRestart-->onStart-->onResume。


0 0
原创粉丝点击