深层链接导致应用程序的多个实例打开

时间:2017-03-09 00:06:16

标签: android android-intent deep-linking

此问题已在类似的帖子中得到解决,但是,我的情况略有不同。我只有一个活动和多个片段。我没有深入链接到特定的片段,我正在启动我的一个活动,然后重定向到不同的片段。我遇到的问题是,当点击深层链接时,应用程序的多个实例正在打开,当阻止打开应用程序的多个实例时,我会失去深度链接意图中的数据。

我已经通过几种方式阻止了多个实例。一个是将singleTop添加到我的清单

android:launchMode="singleTop"

这可以防止多个实例,但是,原始应用实例中的静态数据会丢失。另一种方式我也尝试了以下方式

   // finishes activity if its not the root activity
    if (!FrameworkUtils.checkIfNull(getIntent().getExtras())) {
        if (!isTaskRoot()) {
            finish();
        }
    }

使用此代码,我维护应用程序的原始实例,但是我需要从深层链接获取的意图数据因为应用程序的新实例(我需要)被关闭。

如何解决这种情况,而无需创建其他活动来启动,然后执行类似

的操作
    Intent intent = getIntent();
    String intentUrl = intent.getDataString();
    Intent newIntent = new Intent(this, MainActivity.class);
    newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
    newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    newIntent.putExtra("intentUrl",intentUrl);
    newIntent.setAction(Long.toString(System.currentTimeMillis()));
    startActivity(newIntent);
    finish();

或者更确切地说,如何在用户点击深层链接后删除应用的原始实例并保留应用的新实例?提前致谢

2 个答案:

答案 0 :(得分:3)

请在下面找到只有一个实例的活动代码,您也可以发送数据并进行处理。如果您有任何疑问,请告诉我。

    package example.raghavpai;

    import android.app.Activity;
    import android.content.Context;
    import android.content.Intent;
    import android.os.Bundle;

    /**
     * Created by RaghavPai on 09-03-2017.
     */

    public class MyActivity extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            processDataFromIntent();
        }

        @Override
        protected void onNewIntent(Intent intent) {
            super.onNewIntent(intent);
            setIntent(intent);
            processDataFromIntent();
        }

        private void processDataFromIntent() {
            Intent intent = getIntent();
            if (intent != null) {
                Bundle extras = intent.getExtras();
                if (extras != null) {
                    String message = extras.getString("data_key");
                }
            }
        }

        public static void startMyActivity(Context context, String data) {
            Intent intent = new Intent(context, MyActivity.class);
            intent.putExtra("data_key", data);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent);
        }
    }

同一个

的清单代码
    <activity
        android:name=".MyActivity"
        android:launchMode="singleTask"
        android:screenOrientation="portrait"
        android:theme="@android:style/Theme.Holo.Light.NoActionBar.Fullscreen"></activity>

使用您的任何活动中的公共静态API startMyActivity。

答案 1 :(得分:0)

我找到了一个更适合我的简单解决方案

只需添加这个

if (!isTaskRoot()) {
        finish();
    }