5.4.3 实际应用中的任务控制
不妨从Android源代码出发,看看常用的系统应用如何合理地配置任务模式,控制界面组件栈,来提供更好的用户体验。
对于Android浏览器应用来说,把用户所需的页面信息快速地呈现出来,是非常重要的事情。Android的浏览器应用,将其界面组件BrowserActivity配置成了singleTask,减少可能被构建的组件实例个数,从而提升了启动速度。其配置信息如下:
<activity android:name="BrowserActivity"
android:launchMode="singleTask"
android:alwaysRetainTaskState="true"
…>
…
</activity>
可以看到,BrowserActivity组件的android:launchMode为singleTask,并且,该组件的android:alwaysRetainTaskState属性被置为了true,这使得不论何时打开浏览器,都可以保证组件处于上一次打开时的状态(如果需要展现新的页面,也会在这个基础上来进行)。这样的策略,可以保证用户的操作记录不会丢失。通过这样对任务模式的简单配置,不仅可以提升启动速度,还可以很好地维持交互状态。
Android联系人应用中包含着联系人管理、联系人添加、联系人通话等诸多模块,通过设定任务黏度android:taskAffinity属性,可以将这些不同模块的呈现规划得更为合理:
<application…
android:name="com.android.contacts.ContactsApplication"
android:taskAffinity="android.task.contacts">
<activity android:name=".activities.DialtactsActivity"
android:launchMode="singleTask"
android:clearTaskOnLaunch="true"
android:taskAffinity="android.task.contacts.phone"
…/>
<activity android:name="CallDetailActivity"
android:taskAffinity="android.task.contacts.phone"
…/>
<activity…
android:name=".quickcontact.QuickContactActivity"
android:launchMode="singleTop"
android:taskAffinity="android.task.quickcontact"/>
…
</application>
在联系人应用中,大部分的功能都被规划在了android.task.contacts任务栈中。而和联系人通话管理相关的界面组件被独立地放在android.task.contacts.phone任务栈中,当调用通话记录信息的时候,不会将联系人组件的状态重置。此外,快速添加联系人的界面组件也被剥离了出去,这样第三方在调用时,就不会影响联系人应用本身的状态了。
在实际开发中,当开发的应用功能较为复杂时,就需要通过这样的方式对不同的组件进行整理和划分,使得应用在提供任何功能服务时,都能够保证交互状态的合理性。