当我使用Android市场上的 "Open" 按钮启动时,我遇到了我的应用程序中的一个错误 . 似乎从市场上推出它会使用不同的意图,然后从手机的应用程序菜单中启动它 . 这导致启动相同活动的多个副本,这些副本彼此冲突 .
For example, 如果我的应用程序包含活动A-B-C,则上述问题可能导致堆栈A-B-C-A .
我尝试在所有活动上使用 android:launchMode="singleTask"
来解决这个问题,但每当我点击HOME时,它就会产生不必要的副作用,即将活动堆栈清除为root .
Example: A-B-C - >首页 - > A当我需要的是A-B-C - >首页 - > A-B-C
在使用HOME时,是否有一种防止启动相同类型的多个活动而不重置根活动的好方法?
11 回答
将此添加到onCreate,你应该很高兴:
我只想解释它失败的原因,以及如何以编程方式重现此错误,以便将其合并到测试套件中:
当您通过Eclipse或Market App启动应用程序时,它会使用意图标志启动:FLAG_ACTIVITY_NEW_TASK .
通过启动器(home)启动时,它使用标志:FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_BROUGHT_TO_FRONT | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED,并使用操作“MAIN " and category " LAUNCHER” .
如果您想在测试用例中重现这一点,请使用以下步骤:
然后做任何事情来进行其他活动 . 为了我的目的,我只是放了一个按钮来启动另一个活动 . 然后,回到启动器(主页):
并模拟通过启动器启动它:
如果您尚未合并isTaskRoot()解决方法,则会重现该问题 . 我们在自动测试中使用它来确保此错误不再发生 .
希望这可以帮助!
你试过 singleTop 启动模式吗?
以下是http://developer.android.com/guide/topics/manifest/activity-element.html中的一些描述:
也许是this issue?还是其他形式的同一个bug?
我认为接受的答案(Duane Homick)有未处理的案件:
你有不同的额外内容(结果是app重复):
从市场或主屏幕图标(由市场自动放置)启动应用程序时
这是一个解决方案(SDK_INT> = 11用于通知),我相信这些情况和状态栏通知也是如此 .
Manifest :
Launcher activity :
Service :
Notification :
我意识到这个问题与Xamarin Android没有任何关系,但我想发帖,因为我没有在其他地方看到它 .
要在Xamarin Android中修复此问题,我使用了@DuaneHomick中的代码并添加到
MainActivity.OnCreate()
中 . 与Xamarin的区别在于必须在Xamarin.Forms.Forms.Init(this, bundle);
和LoadApplication(new App());
之后 . 所以我的OnCreate()
看起来像:*编辑:自Android 6.0以来,上述解决方案对某些情况来说还不够 . 我现在也将
LaunchMode
设置为SingleTask
,这似乎使事情再次正常工作 . 不幸的是,不确定这会对其他东西产生什么影响 .我也有这个问题
不要调用finish();在家庭活动中它将无休止地运行 - ActivityManager在完成时调用home活动 .
通常当配置发生变化时(即旋转屏幕,更改语言,电话服务更改,即mcc mnc等),活动将重新创建 - 如果主动活动正在运行,则它再次调用A.以满足需要添加到清单
android:configChanges="mcc|mnc"
- 如果您已连接到蜂窝电话,请参阅http://developer.android.com/guide/topics/manifest/activity-element.html#config,了解启动系统时的配置或按下打开或随你 .尝试此解决方案:
创建
Application
类并在那里定义:然后在
onCreate
之前的第一个(Launcher)活动中setContentView(...)
添加:附:
Controller
是我的Application
班 .我有同样的问题,我使用以下解决方案修复它 .
在您的主要活动中,将此代码添加到
onCreate
方法的顶部:不要忘记在清单中添加此权限 .
希望它能帮助你 .
我发现了一种防止开始相同活动的方法,这对我来说很有用
尝试使用 SingleInstance 启动模式,并将亲和关系设置为 allowtaskreparenting 这将始终在新任务中创建活动,但也允许其重新显示 . 检查dis:Affinity attribute