<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>
所以很简单。当我从启动器图标打开我的应用程序时,它会打开。我再次点击启动器我的应用程序图标它将我的应用程序从打开后再次带到前面。但是,如果我去游戏商店并从那里点击打开我的应用程序有两个实例打开。 如果你想要一个如何工作的例子,facebook也有同样的问题。另外一个app fotmob也有同样的问题。
答案 0 :(得分:6)
我有同样的问题。将以下代码放入您的启动器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 - &gt; B - &gt; C]和A是root Activity, 当您从Play商店启动应用程序时,任务堆栈将变为(系统清除根目录的顶部)[A]但是如果您已完成根活动堆栈将看起来像(系统将创建根活动的新实例并放置现有任务的顶部)[B - > C - &gt; A]。
<强>为什么吗
因为Play商店将使用category = LAUNCHER启动app,action = MAIN,flag = ACTIVITY_NEW_TASK,flag = ACTIVITY_BROUGHT_TO_FRONT
<强>解决方案强>
假设你已经删除了你的root活动,现在你的堆栈是[B - &gt; C],当你试图从游戏商店打开应用程序时,你的筹码变为[B - > C - &gt; A]
现在,A不在堆栈的根目录中并且具有category = LAUNCHER和action = MAIN所以,我们可以使用finish()删除A并且堆栈将保持相同[B - &gt; C]
*注意:在Android 7.0上测试