android 应用程序始终从根活动重新启动,而不是恢复后台状态(已知漏洞)[重复]

50few1ms  于 2023-02-27  发布在  Android
关注(0)|答案(4)|浏览(130)
    • 此问题在此处已有答案**:

Activity stack ordering problem when launching application from Android app installer and from Home screen(3个答案)
How to return to the latest launched activity when re-launching application after pressing HOME? [duplicate](5个答案)
2天前关闭。
我面临的正是这些链接中提到的问题:
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
我有一个简单的根活动,有启动器和主要意图,* 没有别的 *。我启动另一个活动,在清单中 * 没有标志或任何额外的东西 *。
我启动应用(根Activity),然后从那里启动第二个Activity。按下Home键后,任务进入后台。再次启动应用(从Launcher或按住Home键启动最近使用的应用)时,它会在现有堆栈的顶部启动根Activity的新示例。
如果我按下后退按钮,新的"根" Activity将关闭,而旧的第二个Activity将可见,这意味着它将在同一任务中启动根Activity,而不是将任务置于前台。
为了解决这个问题,我将根Activity的启动模式设置为 * singleTask *。现在,当我按home键并再次启动应用时,它会清除旧根任务上方的Activity,并将旧根任务置于前台,而不是将整个旧任务以及第二个Activity置于前台。请注意,旧根任务仍然保留其应用状态,这意味着它不是一个新示例。但较高的活性已被杀死。
它甚至发生在从市场上下载的其他应用程序上。手动安装方法对我没有影响,它仍然以同样的方式启动。

b4wnujal

b4wnujal1#

这是由于用于启动应用的Intent不同。Eclipse使用无操作和无类别的Intent启动应用。Launcher使用具有android.intent.action.MAIN操作和android.intent.category.LaUNCHER类别的Intent启动应用。安装程序使用android.intent.action.MAIN操作和无类别启动应用。
无论是谁提交了这个bug,他们都应该把它写成一个增强Eclipse插件的请求,因为他们显然希望Eclipse能够假装是启动器,并使用与启动器相同的意图启动应用程序。

nkhmeac6

nkhmeac62#

解决方案如下:

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

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

ctehm74n

ctehm74n3#

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

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);
    if (!isTaskRoot()) {
        finish();
        return;
    }
    // other function
    }
7gcisfzg

7gcisfzg4#

适用于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;
                }
            }

相关问题