Activity启动模式

来源:互联网 发布:有赞微商城和淘宝区别 编辑:程序博客网 时间:2024/05/17 02:09

1. standard

每次启动会新建一个实例

2. singleTop

栈顶复用,只有任务栈里面有要启动的activity的实例,并且在栈顶,那么通过调用onNewIntent()直接复用这个实例;否则,重建一个新的实例。

使用场景:适合收到通知弹出展示的activity,如果已经弹出一个界面以后,再有新通知到来可以避免重复创建。

3. singleTask

单例模式。只要全局任务栈中有要启动的activity的实例,则复用,否则新建。

说明:
<1> 启动的时候,会先在系统中查找activity属性值taskAffinity对应的任务是否存在,如果存在,就会在这个任务中启动;否则就会新建任务启动。

<2>. 如果设置了”singleTask”启动模式的Activity不是在新的任务中启动时,它会在已有的任务中查看是否已经存在相应的Activity实例,如果存在,就会把位于这个Activity实例上面的Activity全部结束掉,即最终这个Activity实例会位于任务的堆栈顶端中。例如Activity A(standard),Activity B(singletask),Activity C(standard)启动顺序为
A->B->C->A,此时如果再启动B,结果为A->B,即C和A都被清除掉了。

使用场景:
适合作为应用程序的入口activity启动属性,保证主界面单例唯一,每次启动的时候不保留之前的界面。
案例一 系统Launcher3入口Activity

<activity android:name="com.android.launcher3.Launcher" android:clearTaskOnLaunch="true"android:configChanges="keyboard|keyboardHidden|navigation" android:launchMode="singleTask"android:screenOrientation="nosensor"android:stateNotNeeded="true"android:theme="@style/Theme"android:windowSoftInputMode="adjustPan"><intent-filter>...</intent-filter></activity>

分析:singletask保证了launcher主界面是单例模式的,clearTaskOnLaunch等于true表示在返回到launcher主界面的过程会将任务栈中其他的activity清理出去,这样在launcher主界面点击返回按钮不会再跳转到其他activity了。

案例二 系统浏览器入口activity

BrowserActivity uses singleTask. There is only one browser activity at a time and
it doesn’t become part tasks that send it intents to open web pages. While it might
return to whatever most recently launched it when you hit back it is actually fixed at
the bottom of its own task activity stack. It will share its task with activities that it
launches like bookmarks.

4. singleinstance

跟singletask相似,单例模式。区别在于独享一个任务栈栈,即所在的任务栈不可以再有其他activity实例。

使用场景
案例一 Phone应用模块 来去电界面

<activity android:name="InCallScreen"android:theme="@style/Theme.InCallScreen"android:label="@string/phoneIconLabel"android:excludeFromRecents="true"android:launchMode="singleInstance"android:screenOrientation="nosensor"android:configChanges="keyboardHidden"android:exported="false">        </activity>

分析:Phone模块是系统应用,与telephony运行在同一个进程,优先级非常高。来去电、通话界面都是同一个activity,只是对应的通话状态不一样,显示的数据内容不同。将来去电activity设置为单例模式,并且独占一个任务栈,可以保证activity在跳转到其他activity时不会存在singletask,singletop等属性引起的被从任务栈中清理的问题,提高了安全性。

案例二 闹钟提醒

AlarmAlert uses singleInstance. Only one alert activity at a time and it is always its own
task. Anything it launches (if anything) becomes part of its own new task.

原创粉丝点击