每个Activity启动都需要依赖一个Task栈,在Service中启动Activity时一般使用ApplicationContext,它没自己的Task栈,(Activity有自己的栈,但Service中保存Activity实例容易造成内存泄漏)。 补充说明: 在MainActivity启动时,系统自动创建了App的Task栈,并且taskAffinity默认为包名:com.test.haha。 以下为三种情况: 情况1:只在Acti...
FLAG_ACTIVITY_NEW_TASK:默认,会重新创建新的Activity FLAG_ACTIVITY_SINGLE_TOP:相当于启动模式的singleTop,比如:栈中有:ABCD四个Activity。如果在D中启动D,栈的情况还是ABCD。 FLAG_ACTIVITY_CLEAR_TOP:相当于启动模式的singleTask,比如:栈中有:ABCD四个Activity。如果在D中启动B,则栈成AB FLAG_ACTIVITY_NO_HISTOR...
如果同时使用了FLAG_ACTIVITY_NEW_TASK ,这个时候,目标是Activity自己所属的Task栈,如果在自己的Task中能找到一个Activity实例,则将其上面的及自身清理掉,之后重建。 FLAG_ACTIVITY_CLEAR_TOP| FLAG_ACTIVITY_NEW_TASK如果同时在加上FLAG_ACTIVITY_SINGLE_TOP,会更特殊一些,如果topActivity不是目标Activity,就会去目标T...
在这个场景中,当Activity A启动Activity B时,由于FLAG_ACTIVITY_NEW_TASK标志的存在,Activity B会被放入一个新的任务栈中。由于Activity B是SingleInstance模式的,所以这个新的任务栈只会包含一个Activity B的实例。 但是,这里有一个问题需要注意:当Activity B启动其他Activity(比如Activity C)时,这个新的Activity(Acti...
我们来先看看Google官方文档对于FLAG_ACTIVITY_NEW_TASK是怎么说的: FLAG_ACTIVITY_NEW_TASK 在新的 task 中启动 activity。如果要启动的 activity 已经运行于某 task 中,则那个 task 将调入前台,最后保存的状态也将恢复,activity 将在onNewIntent()中接收到这个新 intent。
在当前App中,通过Intent,使用FLAG_ACTIVITY_NEW_TASK打开了当前App(新Activity的task_affinity与当前app中其他Activity不同)或其他App的一个Activity(非singleInstance), 1.假如这个Activity没有被打开过,且没有一个task的affinity与这个Activity相同,则这个Activity变为新的task的root Activity,创建了一个新的task。
startActivity(Intent(this, AActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) }) 那么从使用排除法得到FLAG_ACTIVITY_NEW_TASK有可能是原因了。另外细心观察上面的步骤,会发现第一步先finish再startActivity,如果去掉finish做实验会发现其实可以成功启动 A_Activity,那么另一个原因应该就是fin...
如果intent中没有添加FLAG_ACTIVITY_NEW_TASK这个属性,那么就会报错。 这也是为什么在Service中调用startActivity和在BroadcastReceiver(静态注册)中通过onReceive传递过来的context.startActivity时(该context类型为ReceiverRestrictedContext,和Service一样,都没有重写startActivity),如果不加FLAG_ACTIVITY_NEW_TASK的话会报如下...
其中点击设置中打开权限的时候启动activity时添加NEW_TASK TAG.并且对返回结果进行判断,如果仍然没有权限的时候,程序 直接finish 结果用户点击了设置-权限,去打开或者关闭权限,并且按back键返回后,activity执行消失了 即当A启动B,B启动C(使用了new task),C界面执行back后,会直接回到A。