为了记录用户开启了那些activity,记录这些activity开启的先后顺序,google引入任务栈(task stack)概念,帮助维护好的用户体验。
如何查看当前系统的任务栈
手机中 --> 长按home或者多任务键会进到 概览屏幕 的一个界面
命令行中 --> adb shell dumpsys activity
概览屏幕(Overview Screen)
概览屏幕(也称为最新动态屏幕、最近任务列表或最近使用的应用)是一个系统级别 UI,其中列出了最近访问过的Activity和任务。 用户可以浏览该列表并选择要恢复的任务,也可以通过滑动清除任务将其从列表中删除。 对于 Android 5.0 版本(API 级别 21),包含多个文档的同一 Activity 的多个实例可能会以任务的形式显示在概览屏幕中。例如,Google Drive 可能对多个 Google 文档中的每个文档均执行一个任务。每个文档均以任务的形式显示在概览屏幕中。
Task中activity的特点:
- 可以来自不同的app
- 可以运行在不同进程
影响Task的activity的属性和Intent标识
Activity的属性:
- launchMode
- taskAffinity
- allowTaskReparenting
- clearTaskOnLaunch
- alwaysRetainTaskState
- finishOnTaskLaunch
Intent的标识(四个与task直接关系的):
- FLAG_ACTIVITY_NEW_TASK
- FLAG_ACTIVITY_CLEAR_TOP
- FLAG_ACTIVITY_SINGLE_TOP
- FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
…
什么是Activity的启动模式(LaunchMode)
启动模式简单地说就是Activity启动时的策略,在AndroidManifest.xml中的标签的android:launchMode属性设置
启动模式有4种,分别为standard、singleTop、singleTask、singleInstance;
这四种模式影响了Activity所在的任务栈.
使用方式:在清单文件中activity的节点加入launchMode属性
默认模式,当Intent发送的时候,每次打开都会创建一个新的Activity实例。
如果app1启动了app2的activity,则会将APP2的activity自动加入到app1的activity所在的task
在5.0中,也没有出现跨应用会在新的task中启动activity的的情况 与该文章Understand Android Activity’s launchMode: standard, singleTop, singleTask and singleInstance描述的并不太一样
几乎和standard模式一模一样,一个singleTop的Activity的实例可以无限多,唯一的区别是如果当前activity已经在栈顶的话,则不会再创建一个新的activity,通过**onNewIntent()**将intent发送给现有的Activity。
- singleTop模式,只在当前任务栈中生效.
- 如果通过startActivityForResult启动一个设置了singleTop的activity,singleTop模式将无效(不知道为什么网上很多人说该设置该singleTop也会导致立即在onActivityResult中返回一个为cancel的resultCode,实测下来4.x,5.x的版本都没问题)
onNewIntent()使用Tips
- 方法体中需手动调用setIntent(intent),否则之后的getIntent()获取的都是旧的intent对象;
- 被onNewIntent方式打开的activity,对生命周期的影响.
- 之前activity是resume状态,onNewIntent()后只会调用onResume()方法
- 否则按照
onNewIntent->onRestart->onStart->onResume->.
应用场景
这种启动模式的用例之一就是搜索功能。假设我们创建了一个搜索框,点击搜索的时候将导航到一个显示搜索结果列表的SearchActivity中,为了更好的用户体验,这个搜索框一般也会被放到SearchActivity中,这样用户想要再次搜索