Activity是四种启动模式及应用场景

1,123 阅读3分钟

契子:

在这之前,我们先抛出来几个问题:

  • 为什么要使用应用场景?
  • 每个应用场景的特点?
  • 以及在什么地方进行使用?

一、为什么要使用应用场景?

在我们平常使用一个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:

一些来电呼叫页面,闹钟。

参考博客:点击跳转