50

我正面临这些链接中提到的问题:

http://code.google.com/p/android/issues/detail?id=2373

http://groups.google.com/group/android-developers/browse_thread/thread/77aedf6c7daea2ae/da073056831fd8f3?#da073056831fd8f3

http://groups.google.com/group/android-developers/browse_thread/thread/2d88391190be3303?tvc=2

我有一个带有 LAUNCHER 和 MAIN 意图的简单根活动,没有别的。我开始另一个活动,但清单中没有任何标志或任何额外内容。

我启动应用程序(根活动)并从那里开始第二个活动。按下 Home 按钮后,任务进入后台。再次启动应用程序时(从启动器或按住最近应用程序的主页按钮),它会在现有堆栈之上启动根活动的新实例。

如果我按下后退按钮,新的“根”活动关闭并且旧的第二个活动可见,这意味着它在同一任务中启动根活动,而不是将任务带到前台。

为了解决这个问题,我制作了根活动的启动模式singleTask。现在,当我按下 home 键并再次启动应用程序时,它会清除旧根任务上方的活动,并将旧根任务带到前台,而不是仅仅将带有第二个活动的整个旧任务放在前面。请注意,旧的根任务仍保留其应用程序状态,这意味着它不是新实例,但更高的活动已被杀死。

它甚至出现在从市场上下载的其他应用程序上。手动安装方法对我没有影响,它仍然以相同的方式启动。

4

5 回答 5

64
    @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... 
} 
于 2012-05-15T10:17:42.850 回答
25

这是由于用于启动应用程序的意图不同。Eclipse 使用没有操作和类别的意图启动应用程序。Launcher 使用具有 android.intent.action.MAIN 动作和 android.intent.category.LAUNCHER 类别的意图启动应用程序。安装程序使用 android.intent.action.MAIN 操作启动一个应用程序,并且没有类别。

提交该错误的人可能应该将其表述为增强 Eclipse 插件的请求,因为他们显然希望 Eclipse 能够伪装成启动器并使用与启动器相同的意图来启动应用程序。

于 2010-02-17T18:50:56.853 回答
6

这是解决方案:

@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....
}

编辑:我遇到了新意图和通知的问题。以前的解决方案不适用于通知和意图......

于 2015-02-03T12:26:33.180 回答
2

只需将其添加到启动器活动的 onCreate 方法中,如下所示:

      @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);
    if (!isTaskRoot()) {
        finish();
        return;
    }
    // other function
    }
于 2018-07-31T09:33:41.350 回答
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;
                }
            }
于 2017-02-08T23:27:57.177 回答