在Android编程中flag_activity_new_task,设置intent的flag_activity_new_task标志,实际上是在处理Activity的亲和性属性,即taskAffinity每个应用程序中的Activity都有一个taskAffinity属性,通常在Manifest文件中手动设置然而,通常情况下,这个属性会被忽略,因为一个应用程序中所有Activity的taskAffinity都继承自应用程序级别的taskAffi;在android里,有4种activity的启动模式,分别为“standard” 默认“singleTop”“singleTask”“singleInstance”1 如何决定所属task “standard”和”singleTop”的activity的目标task,和收到的Intent的发送者在同一个task内,除非intent包括参数FLAG_ACTIVITY_NEW_TASK如果提供flag_activity_new_task了FLAG_ACTIVITY_NEW_TASK。
采用 ApplicationstartActivity 偶现无法启动Activity的现象首先查询 Contextjava 中 startActivity 方法的描述,部分内容如下从以上描述可以看出,如果调用 startActivity 方法的Context不是Activity的话,Intent必须要包含FLAG IntentFLAG_ACTIVITY_NEW_TASK ,原因是因为没有Activity启动Activity时;ServiceA中启动一个了一个ActivityC,由于Activity是在非Acitivity环境下启动的,需要设置 FLAG_ACTIVITY_NEW_TASK标签这里就是我们讨论的重点,稍候会详细分析当ActivityC完成任务后会重新跳转到ActivityA最后,见证奇葩的时刻到了,我们点击ActivityA的启动ActivityB的button,ActivityC出现在了我们的。
区别于默认优先启动在activity栈中已经存在的activity如果之前启动过,并还没有被destroy的话而是无论是否存在,都重新启动新的activity 帮助文档如下面说的If set, this activity will become the start of a new task on this history stack翻译如果设置,这项活动将成为一个新的开始;android intent中设置如下flag,可以清除栈顶的activityintentsetFlagsIntentFLAG_ACTIVITY_CLEAR_TOP还有其他tag如下FLAG_ACTIVITY_CLEAR_TOP跳转到的activity若已在栈中存在,则将其上的activity都销掉2FLAG_ACTIVITY_NEW_TASKactivity要存在于activity的栈中,而非activity的途径启动activity;通过检查所有可能导致失败的 return 地点,发现是在 complyActivityFlags 方法中,由于特定的启动旗标组合包括 FLAG_ACTIVITY_NEW_TASK,但没有 FLAG_ACTIVITY_CLEAR_TASKFLAG_ACTIVITY_CLEAR_TOPFLAG_ACTIVITY_REORDER_TO_FRONT,导致启动流程无法正常进行此外,即使没有启动 A_Activity,B_Activit;解决这个问题的方法有几种一种方法是使用Intent的FLAG_ACTIVITY_NEW_TASK标志,这将创建一个新的任务栈,并将Activity置于其中,从而避免重复启动另一种方法是使用Intent的FLAG_ACTIVITY_REORDER_TO_FRONT标志,这样可以确保Activity处于堆栈顶部,但不会重新启动它值得注意的是,这个警告本身并不会影响;手机关机代码In frameworksbaseservicesjavacomandroidserverBatteryServiceIntent intent = new IntentIntentACTION_REQUEST_SHUTDOWNintentputExtraIntentEXTRA_KEY_CONFIRM, falseintentsetFlagsIntentFLAG_ACTIVITY_NEW_TASKmContextstartActivityintent手机充电的;界面劫持即自己的应用使用过程中,被恶意app弹出的劫持页面覆盖掉了自己app的页面,而许多用户并未察觉异样,从而输入了敏感信息导致信息被窃取罪魁祸首在于Android的一个系统漏洞,FLAG_ACTIVITY_NEW_TASK标志位可以让自己的activity覆盖掉其他activity页面而界面劫持目前的防护做法只能是当我们的app被非人为。
以下总结了能够模拟退出效果的两个方案方案1打开系统主屏来模拟应用退出的效果,这和用户按Home键没有什么区别Intent intent = new IntentIntentACTION_MAIN intentaddCategoryIntentCATEGORY_HOME intentsetFlagsIntentFLAG_ACTIVITY_NEW_TASK startActivityintent方案2直接杀掉;moveTaskToFront appActivityManagerhtml#moveTaskToFrontint, int如果flag_activity_new_task你和我一样苦逼的在用22的平台,那么就要稍微麻烦点了,基本上是用taskAffinity + FLAG_ACTIVITY_NEW_TASK + FLAG_ACTIVITY_SINGLE_TOP先来看一下sdk怎么说的1 taskAffinitySDK;它紧跟FLAG_ACTIVITY_NEW_TASK联合使用FLAG_ACTIVITY_CLEAR_TOP如果给Intent对象设置这个标记,并且要启动的Activity在当前任务中已经运行了,那么不是创建一个这个Activity的新的实例,而是把堆栈中这个Activity之上的所有其他Activity都关掉,然后把新的Intent对象发送给这个既存的Activity这时它在堆栈的顶部FLAG_;IntentFLAG_ACTIVITY_NEW_TASK 默认的跳转类型,会重新创建一个新的Activity,不过与这种情况,比方说Task1中有A,B,C三个Activity,此时在C中启动D的话,如果在Manifestxml文件中给D添加了Affinity的值和Task中的不一样的话,则会在新标记的Affinity所存在的Task中压入这个Activity如果是默认的或者。
在Service中启动Activity,很多人说在非Activity中启动Activity需要加FLAG_ACTIVITY_NEW_TASK flag,如果我不加会怎么样呢并没有出现异常和崩溃,跳转也是正常的,但是与之前所说的会崩溃报出异常不符合啊难道是与版本有关吗于是我使用了Android 23去测试果然抛出了异常 ContextImpl在Android studio;启动flag归类 启动flag主要可以分为三类第一类是决定Activity应放置在哪个Task中,例如FLAG_ACTIVITY_NEW_TASK第二类是说明放置目标Task之后,其他Activity应如何处理,例如FLAG_ACTIVITY_CLEAR_TASK和FLAG_ACTIVITY_CLEAR_TOP第三类是给Activity添加特定标记,如FLAG_NEW_DOCUMENT这些归类能够帮助我们清晰;答案可以放在不同的Task中需要为不同的activity设置不同的affinity属性,启动activity的Intent需要包含FLAG_ACTIVITY_NEW_TASK标记。
上一篇: 谷歌地球经纬度,谷歌地球经纬度查询位置
联系电话:18300931024
在线QQ客服:616139763
官方微信:18300931024
官方邮箱: 616139763@qq.com