我正面对这些链接中提到的问题:
http://code.google.com/p/android/issues/detail?id=2373
http://groups.google.com/group/android-developers/browse_thread/thread/2d88391190be3303?tvc=2
我有一个简单的root活动,包含LAUNCHER和MAIN意图,没有别的。我开始了另一项活动,在清单中没有没有标志或任何额外的。
我启动应用程序(root活动),然后从那里开始第二个活动。按Home(主页)按钮后,任务将进入后台。在再次启动应用程序时(从Launcher或通过按住最近应用程序的主页按钮),它会在现有堆栈的顶部启动根活动的新实例。
如果按下后退按钮,新的“root”活动将关闭,旧的第二个活动可见,这意味着它将在同一任务中启动根活动,而不是将任务带到前台。
为了解决这个问题,我做了root活动的启动模式 singleTask 。现在,当我按下主页并再次启动应用程序时,它会清除旧的根任务上方的活动,并将旧的根任务带到前台,而不是仅将第二个活动的整个旧任务放在最前面。请注意,旧的根任务仍然保留其应用程序状态,这意味着它不是新实例,但是较高的活动已被杀死。
甚至发生在从市场上下载的其他应用程序中。手动安装方法对我没用,它仍然以相同的方式启动。
答案 0 :(得分:62)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {
// Activity was brought to front and not created,
// Thus finishing this will get us to the last viewed activity
finish();
return;
}
// Regular activity creation code...
}
答案 1 :(得分:25)
这是因为用于启动应用程序的意图不同。 Eclipse使用没有操作且没有类别的intent启动应用程序。 Launcher使用android.intent.action.MAIN动作和android.intent.category.LAUNCHER类别的intent启动应用程序。安装程序使用android.intent.action.MAIN操作启动应用程序,没有类别。
提交错误的人应该把它作为对Eclipse插件增强的请求,因为他们显然希望Eclipse能够伪装成启动器并使用与启动器相同的意图启动应用程序。
答案 2 :(得分:5)
以下是解决方案:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0 & getIntent().getExtras() == null) {
finish();
return;
}
Your code....
}
编辑:我遇到了新的意图和通知问题。以前的解决方案不适用于通知和意图...
答案 3 :(得分:1)
只需将其添加到启动器活动的onCreate方法中,如下所示:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
if (!isTaskRoot()) {
finish();
return;
}
// other function
}
答案 4 :(得分:0)
Xamarin.Android的类似解决方案:
if (!IsTaskRoot)
{
string action = this.Intent.Action;
if (this.Intent.HasCategory(Intent.CategoryLauncher) && !string.IsNullOrEmpty(this.Intent.Action) && action == Intent.ActionMain)
{
Finish();
return;
}
}