Activity启动模式的一些点

Intent.FLAG_ACTIVITY_NEW_TASK的理解

首先会查找是否存在和被启动的Activity具有相同的亲和性的任务栈(即taskAffinity,注意同一个应用程序中的activity的亲和性相同),如果有,则直接把这个栈整体移动到前台,并保持栈中旧activity的顺序不变,然后被启动的Activity会被压入栈如果没有,则新建一个栈来存放被启动的activity,注意,默认情况下同一个应用中的所有Activity拥有相同的关系(taskAffinity).

默认情况下同一个应用中的所有Activity,都拥有相同的关系(taskAffinity),即由FLAG_ACTIVITY_NEW_TASK开启的新Activity,也都在同一个任务栈中(与Application相同的任务栈),若想使新Activity进入不同栈中,则还需要如下配置:

<activity
  android:name=".ui.activity.OtherTaskActivityXXX"
  android:taskAffinity="android.task.browser"/> 

并且在该OtherTaskActivityXXX页面中,若再开启的其他页面,那么所有的其他页面,都将被压入到这个新的任务栈中。

singleTask的理解

  • 使用singletask并不会创建新的任务栈(Task),也就是TaskId是一样的。
  • 如果它已经存在于栈中,再次请求触发此Activity时,会调用此类实例的onNewIntent方法,不会重新创建新的实例,即不会走onCreate方法。
  • 如果它已经存在于栈中,再次请求触发此Activity时,那么其之上的Activity会全部出栈。比如当前栈栈内有A->B->C->D,B是singletask,其他均为standard,再次启动B时,C和D出栈,栈变为A->B。

singleInstance的理解

  • 如果此Activity没有实例,它会创建一个新的任务栈(新的TaskId),并把该Activity入栈。
  • 如果任务栈中已经有此实例,会调用onNewIntent方法,不会创建新的任务栈和实例,即不会走onCreate方法。

taskAffinity属性

  • taskAffinity值是一个字符串,可以指定为任意字符串,但是必须至少包含一个”.”,否则会报错
  • taskAffinity 单独使用并不会生效。要想其生效,需要配合其他属性使用比如设置launchmode为singleTask或者singleInstance(singleInstance强制会在新的task),或者配合 Intent.FLAG_ACTIVITY_NEW_TASK,或者配合
    allowTaskReparenting 。使用时用其中的一个就行。
  • 一些应用:https://www.cnblogs.com/ldq2016/p/6953106.html
  • 测试实例:https://www.jianshu.com/p/41dd76c3463d

Activity的各种finish

  • finish ():finish ()方法在你的activity结束或者应该被关闭时调用。ActivityResult将通过onActivityResult()方法传递给启动者。这是比较常用的关闭Activity的方法。
  • finishActivity (int requestCode):强制关闭另一个先前通过startActivityForResult(Intent, int)启动的Activity。
  • finishAffinity ():关闭该Activity和同一栈中的所有位于该Activity下面的Activity。比如说在同一Activity栈中,Activity A启动了Activity B,Activity B启动了Activity C。Activity B调用finishAffinity()方法,会关闭 Activity A和 Activity B,Activity C仍然存在。如果Activity C调用该方法,则A,B,C,都会被关闭,且如果应用只有这一个栈,那么C调用该方法会直接退出应用。
  • finishActivityFromChild (Activity child, int requestCode):API level 13废弃
  • finishAndRemoveTask ():关闭当前Activity且关闭该Activity作为根Activity的的任务。长按home在最近使用栈里面看不到该应用的任何栈,但是除了该activity的该应用的其他栈并不会清除
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值