契子:
在这之前,我们先抛出来几个问题:
- 为什么要使用应用场景?
- 每个应用场景的特点?
- 以及在什么地方进行使用?
一、为什么要使用应用场景?
在我们平常使用一个app的使用,都是会对它进行一系列的操作,比如点击、长按、移动等, 有直接在当前页面触发,也有跳转到另一个页面进行触发的。每当我们跳转到一新的activity的时候,就会在任务栈中创建一个新的,如果来回调用这个activity就会一直重复创建这个activity,一旦重复的多了,很大程度会导致内存泄漏。
所以可以看出设计目的(个人观点):
- 复用机制,节省系统资源。比如在我们经常使用的页面,使用栈内复用,就会节省资源。
- 根据用户的交互需求,定义适合的应用场景。
二、每个应用场景的特点?
Standard(标准模式):
这个启动模式是Activity的默认启动模式,每次启动的时候都会去创建一个新的对象,不管这个实例是否已经存在,会默认进入启动它的所属的任务栈中。
SingleTop(栈顶复用模式)
如果要使用的Activity在任务栈的栈顶,那么当前的Activity就不会被创建,会调用onNewIntent方法,进行复用。如果栈顶没有的话,还是会重新创建。
SingleTask(栈内复用模式)
只要Activity还存在于任务栈中,那么不管多少次启动都不会重新去创建新的实例,但是会将该activity之上的所有activity弹出任务栈并销毁。如果不存在的话,就会重新创建一个。
SingleInstance(单实例模式)
使用该模式的Activity会单独存在一个任务栈中,且任务栈中只有唯一一个实例。
三、启动模式的设置
- 在AndroidMainifest设置LaunchMode
- 通过Intent设置标志位Intent Flag
<activity
android:name=".MainActivity"
android:launchMode="singleTask">
</activity>
Intent intent = new Intent(MainActivity.this, LoginActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
- 优先级不同:Intent设置方式的优先级 > Manifest设置方式,即以前者为准。
- 限定范围不同Manifest设置方式无法设定FLAG_ACTIVITY_CLEAR_TOP;Intent设置方式无法设置单例模式(SingleInstance)。
四、以及在什么地方进行使用?
标准模式我就不在赘述了。说一下其他三个: SingleTop:
商品详情页面,这个时候就不需要重新再创建一个新的商品详情Activity页面,直接复用已有的页面
SingleTask:
聊天页面,当从聊天页面进入其他页面,然后在重新进入聊天页面时就会直接进入原来的聊天页面,同时销毁中间新创建的Activity页面,并刷新聊天页面的数据。 主页面,当功能执行完毕后返回主页是,销毁之前的页面。
SingleInstance:
一些来电呼叫页面,闹钟。
参考博客:点击跳转