应用程序在 Play 商店打开时重新启动点击

App restarting on play store open click

 <activity
            android:name=".activity.landingpage.LandingPageActivity"
            android:label="@string/app_name"
            android:launchMode="singleTop"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

就这么简单。当我从启动器图标打开我的应用程序时,它 opens.I 去并再次单击启动器我的应用程序图标,它再次将我的应用程序带到前面,因为它 open.However,如果我去 Play 商店并单击打开从那里我的应用程序打开了两个实例。 如果你想要一个如何工作的例子,facebook 有同样的问题。我认为另一个应用程序 fotmob 也有同样的问题。

我有同样的问题。将以下代码放入您的启动器 Activity.

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
     if (!isTaskRoot()
                && getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
                && Intent.ACTION_MAIN.equals(getIntent().getAction())) {
            finish();
            return;
        }
     //other code
}

问题:

假设你有任务堆栈 [A -> B -> C] 并且 A 是根 Activity, 当您从 Play 商店启动应用程序时,任务堆栈将变为(系统清除根的顶部)[A] 但是如果您完成了根 Activity 堆栈将看起来像(系统将创建根的新实例 Activity 并放在现有任务的顶部) [B -> C -> A].

为什么?

因为 Play 商店将启动 category=LAUNCHER, action=MAIN, flag = ACTIVITY_NEW_TASK, flag = ACTIVITY_BROUGHT_TO_FRONT

的应用

解决方案

举个例子,你已经删除了你的根 activity,现在你的堆栈是 [B -> C],当你尝试从 Play 商店打开应用程序时,你的堆栈变成 [B -> C -> A]

现在,A 不在堆栈的根目录中并且具有 category = LAUNCHER 和 action = MAIN 因此,我们可以使用 finish() 删除 A 并且堆栈将保持不变 [B -> C]

*注意:在 android 7.0

上测试