很抱歉,如果这看起来像Deep link is causing multiple instances of the app to open这样的重复问题。但是,我想从评论和答案来看,如果没有适当的截图,我们大多数人都很难理解这个问题。
在您决定将此标记为重复之前,请允许我进一步详细说明问题。
有两种方法可以启动我的应用
我想要实现的目标是,无论我如何启动应用,无论是通过深层链接还是点击应用图标,我都希望只有1个应用实例出现在任务列表中。< / p>
但事实并非如此。请在下面查看我如何重现问题。
正如您在任务列表中看到的那样。有2个应用程序实例。最前面的部分是使用深层链接调用的,最后面部分是通过点击应用程序图标调用的。
我尝试将以下技术应用于一起,以确保任务列表中只有1个应用实例。
<activity
android:name=".JStockFragmentActivity"
android:launchMode="singleTop"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter android:autoVerify="true">
<!-- Sets the intent action to view the activity -->
<action android:name="android.intent.action.VIEW" />
<!-- Allows the link to be opened from a web browser -->
<category android:name="android.intent.category.BROWSABLE" />
<!-- Allows the deep link to be used without specifying the app name -->
<category android:name="android.intent.category.DEFAULT" />
<!-- Accepts URIs that begin with "http://jstock.co/a/investing” -->
<data android:scheme="http"
android:host="jstock.co"
android:pathPrefix="/a/investing" />
<!-- Accepts URIs that begin with "https://jstock.co/a/investing” -->
<data android:scheme="https"
android:host="jstock.co"
android:pathPrefix="/a/investing" />
</intent-filter>
</activity>
https://stackoverflow.com/a/7748416/72437
中提到了这种技术public class JStockFragmentActivity extends AppCompatActivity implements GoogleApiClientFragment.ConnectionCallbacks {
@Override
public void onCreate(Bundle savedInstanceState) {
Utils.updateTheme(this);
super.onCreate(savedInstanceState);
// http://stackoverflow.com/questions/4341600/how-to-prevent-multiple-instances-of-an-activity-when-it-is-launched-with-differ
//
// Possible work around for market launches. See http://code.google.com/p/android/issues/detail?id=2373
// for more details. Essentially, the market launches the main activity on top of other activities.
// we never want this to happen. Instead, we check if we are the root and if not, we finish.
//
// The following code must be run after super.onCreate
if (!isTaskRoot()) {
final Intent intent = getIntent();
final String intentAction = intent.getAction();
if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && intentAction != null && intentAction.equals(Intent.ACTION_MAIN)) {
Log.w(TAG, "Main Activity is not the root. Finishing Main Activity instead of launching.");
finish();
return;
}
}
但是,上述两种技术并不能防止多个应用实例出现在任务列表中。
我可以知道,你们有没有人遇到类似的问题?您是否有一个很好的解决方案来确保任务列表中只有1个应用实例?
答案 0 :(得分:2)
尝试将launchmode
更改为singleTask
。
Android文档说:
系统在新任务和路由的根目录下创建活动 意图。但是,如果活动的实例已经存在 存在,系统通过a将意图路由到现有实例 调用它的onNewIntent()方法,而不是创建一个新方法。
另一种解决方案可能是singleInstance
。
Android文档说:
与&#34; singleTask&#34;相同,除了系统没有启动任何其他 活动进入持有实例的任务。活动总是如此 其任务的唯一成员。