Android的活动启动模式

启动模式一共有4种,分别是standard、singleTop、singleTask and singleInstance。

如何设定启动模式

一般来说,如果你没有用特定的代码表明启动模式,该活动会默认使用standard模式。
那么如何改变启动模式呢?

改变启动模式其实很简单。
我们只需要在AndroidManifest.xml中通过给< activity >标签指定android:launchMode属性来选择启动模式。

standard

在该模式下,每当启动一次活动,他就会从返回栈中入栈,并处于栈顶的位置。对于该模式下,系统不会管是否这个活动已经在返回栈中存在,每次启动都会创建一次该活动的实例,比如你要玩植物大战僵尸,一开始你本来正在玩着,然而你不小心返回桌面,此时你再点击植物大战僵尸的图标进入游戏,你会发现你又重新进入登录界面了,而不是你原来正在玩的游戏界面。

所以这个模式在很多情况下是不合理的。
在这里插入图片描述

singleTop

在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例。

不过当活动并未处于栈顶位置时,这时再启动活动,还是会创建新的实例的。
在这里插入图片描述

singleTask

每次启动该活动时系统首先会在返回栈中检查是否存 在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统 出栈,如果没有发现就会创建一个新的活动实例。

这个模式更像我们平时使用的模式。
在这里插入图片描述

singleInstance

假设我们的程序中有一个活动是允许其他程 序调用的,如果我们想实现其他程序和我们的程序可以共享这个活动的实例,应该如何实现 呢?使用前面3种启动模式肯定是做不到的,因为每个应用程序都会有自己的返回栈,同一个活 动在不同的返回栈中入栈时必然是创建了新的实例。

指定为singleInstance模式的活动会启用一个新的返回栈 来管理这个活动

这怎么理解呢?
我们设定三个Activity,分别为FirstActivity、SecondActivity、ThirdActivity。

其中SecondActivity设定为singleInstance模式。

一开始启动FirstActivity,然后在FirstActivity里启动SecondActivity,再在SecondAc中启动ThirdActivity。
然后我们按下Back键进行返回,你会发现ThirdActivity竟然直接返回到了FirstActivity,再按下 Back键又会返回到SecondActivity,再按下Back键才会退出程序,这是为什么呢?其实原理很简单,由于FirstActivity和ThirdActivity是存放在同一个返回栈里的,当在ThirdActivity的界面按下 Back键,ThirdActivity会从返回栈中出栈,那么FirstActivity就成为了栈顶活动显示在界面上,因 此也就出现了从ThirdActivity直接返回到FirstActivity的情况。然后在FirstActivity界面再次按下 Back键,这时当前的返回栈已经空了,于是就显示了另一个返回栈的栈顶活动,即 SecondActivity。最后再次按下Back键,这时所有返回栈都已经空了,也就自然退出了程序。
在这里插入图片描述
如果想销毁活动可以新建一个ActivityCollector 类作为活动管理器

public class ActivityCollector { 
public static List<Activity> activities = new ArrayList<>(); 
public static void addActivity(Activity activity) { 
activities.add(activity); }
public static void removeActivity(Activity activity) { 
activities.remove(activity); }
public static void finishAll() { 
for (Activity activity : activities) { 
if (!activity.isFinishing()) { 
activity.finish(); }
 }
 activities.clear();
  }
}

用list来暂存活动

注意在使用该方法时需要重写onDestory函数,确保退出的时候remove了活动
不管你想在什么地方退出程序,只需要调用ActivityCollector.finishAll()就可以退出所有的活动了。

如果想保证程序完全退出,我们可以采用杀死进程的方法。

android.os.Process.killProcess(android.os.Process.myPid());

其中,killProcess() 方法用于杀掉一个进程,它接收一个进程id 参数,我们可以通过 myPid() 方法来获得当前程序的进程id 。需要注意的是,killProcess() 方法只能用于杀 掉当前程序的进程,我们不能使用这个方法去杀掉其他程序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值