【android】Activity启动模式

本文参考自:

①《Android开发艺术探索》

②Android Developers: https://developer.android.google.cn/guide/components/activities/tasks-and-back-stack

 

Android Activity启动模式共有4种:standard(默认模式)、singleTop、singleTask和singleInstance。

启动模式设置

启动模式设置有两种方法,一种是在清单文件中设置,另一种是在Intent中设置标志位来指定activity启动模式。

1、在清单文件中设置:

<activity android:name=".login.LoginActivity"
            android:launchMode="singleTop" />

2、在Intent中设置标志位

Intent intent = new Intent(mContext, StuffDetailActivity.class);
            intent.putExtra("STUFFID", stuffId);
            intent.setFlags(FLAG_ACTIVITY_NEW_TASK);
            mContext.startActivity(intent);

如果在非activity的上下文中开启activity,就必须添加标志位,否则会提示以下异常。

Calling startActivity from outside of an activity context requeies the FLAG_ACTIVITY_NEW_TASK flag.

启动模式介绍

0、任务栈

(1)任务栈是一个栈结构,具有先进后出的特性,每个Activity都存放在任务栈中。

(2)每创建或者退出一个acitivity,都会在修改任务栈的内容。

(3)只有栈顶的activity才能和用户进行交互。

(4)当所有activity都出栈时,任务栈才能被销毁

(5)任务栈分为前台任务栈和后台任务栈,前台任务栈是当前页面中所显示的Activity所在的任务栈,其余任务栈为后台任务栈。

 

1、standard:

标准模式,也是默认模式,Activity设置了该模式后,每次启动一个activity都会创建一个新的实例,并添加到当前任务栈中,一个任务栈可以有多个相同实例,每个实例也可以属于不同的任务栈。该启动模式符合常规的activity生命周期。

如图,当以standard模式,再次启动MainActivity时,就会创建一个新的MainActivity实例。

2、singleTop

栈顶复用模式。

①如果新Activity已经位于任务栈栈顶,则不会重新创建Activity,同时onNewIntent方法会被回调,通过该方法,可以获取到请求该activity中的数据,同时onCreate、onStart方法不会被调用。

②如果activity实例已存在,但是不是位于栈顶,则该activity还是会被重新创建。

如上图,当B位于栈顶时,则不再创建新的Bactivity。

如上图,AActivity不位于栈顶,启动AActivity,则重新创建新的A。

如上图,启动AActivity,会在该重新创建AActivity。

3、SingleTask

栈内复用。在该模式下,如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时onNewIntent方法会被回调。

①如果A Activity请求启动,先寻找是否存在A想要的任务栈,如果不存在创建一个新的任务栈,并将A入栈。

②如果存在A所需要的任务栈,要判断A在栈中是否存在,如果存在,则将A调到栈顶并调用onNewIntent方法,如果实例不存在,则创建A并放置栈中。

4、SIngleInstance

单实例模式。具有singleTask的所有特性,并且该Activity只能存在于单独的一个任务栈中,后续的所有请求均不会创建新的Activity,除非这个任务栈被系统销毁。

 

任务相关性(TaskAffinity)

任务相关性是一个参数,该参数标识了Activity所需任务栈的名称(也就是singleTask中,提及到的Activity所需任务栈),默认情况下,所需的任务栈的名称为项目的包名。该标识主要用于多个应用之间的Activity创建,比如A应用需要创建B应用中的b Acitivity,然后按Home键回到桌面, 点击B应用,这是启动的是A应用中,任务栈的BAcitivity。

 

Acitivity标志位

标志位可以用于intent中,Activity的启动模式。

FALG_ACTIVITY_NEW_TASK:指定启动模式为SingleTask

FALG_ACTIVITY_SINGLE_TOP:指定启动模式为singleTop

FALG_ACTIVITY_CLEAR_TOP:同一任务栈中所有位于该Acitivity上的Activity都要出栈。

 

 

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值