如何防止深层链接导致同一应用的多个实例?

时间:2017-08-10 19:31:02

标签: android

很抱歉,如果这看起来像Deep link is causing multiple instances of the app to open这样的重复问题。但是,我想从评论和答案来看,如果没有适当的截图,我们大多数人都很难理解这个问题。

在您决定将此标记为重复之前,请允许我进一步详细说明问题。

有两种方法可以启动我的应用

  1. 点击应用图标
  2. 点击深层链接
  3. 我想要实现的目标是,无论我如何启动应用,无论是通过深层链接还是点击应用图标,我都希望只有1个应用实例出现在任务列表中。< / p>

    但事实并非如此。请在下面查看我如何重现问题。

    第1步:点击应用图标

    enter image description here

    第2步:检查任务列表

    enter image description here

    步骤3:启动GMail应用程序并检查任务列表

    enter image description here

    步骤4:点击电子邮件中的深层链接,然后再次检查任务列表

    enter image description here

    正如您在任务列表中看到的那样。有2个应用程序实例。最前面的部分是使用深层链接调用的,最后面部分是通过点击应用程序图标调用的。

    我尝试将以下技术应用于一起,以确保任务列表中只有1个应用实例。

    singleTop

        <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>
    

    isTaskRoot

    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个应用实例?

1 个答案:

答案 0 :(得分:2)

尝试将launchmode更改为singleTask

Android文档说:

  

系统在新任务和路由的根目录下创建活动   意图。但是,如果活动的实例已经存在   存在,系统通过a将意图路由到现有实例   调用它的onNewIntent()方法,而不是创建一个新方法。

另一种解决方案可能是singleInstance。 Android文档说:

  

与&#34; singleTask&#34;相同,除了系统没有启动任何其他   活动进入持有实例的任务。活动总是如此   其任务的唯一成员。