<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>
所以它很简单。当我从启动器图标打开我的应用程序时,它会打开。我去再次单击启动器我的应用程序图标,它将我的应用程序自打开以来再次带到前面。但是,如果我转到 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 是根活动, 当您从Play商店启动应用程序时,任务堆栈将变为(系统清除根的顶部([A],但是如果您已完成根活动堆栈,则如下所示(系统将创建根活动的新实例并放置在现有任务的顶部([B -> C -> A]。
为什么?
因为Play商店将启动类别=启动器,动作=主要,标志= ACTIVITY_NEW_TASK,标志=ACTIVITY_BROUGHT_TO_FRONT
的应用程序溶液
假设您已经删除了根活动,现在您的堆栈是 [B -> C],当您尝试从 Play 商店打开应用程序时,您的堆栈变为 [B -> C -> A]
现在,A 不在堆栈的根目录中,并且具有类别 = 启动器和操作 = MAIN,因此,我们可以使用 finish(( 删除 A,堆栈将保持不变 [B -> C]
*注意:在安卓 7.0 上测试