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

por*_*der 7 android deep-linking android-intent

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

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

android:launchMode="singleTop"
Run Code Online (Sandbox Code Playgroud)

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

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

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

如何解决这种情况,而无需创建额外的活动来启动,然后执行类似的操作

    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();
Run Code Online (Sandbox Code Playgroud)

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

小智 7

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

    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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

相同的清单代码

    <activity
        android:name=".MyActivity"
        android:launchMode="singleTask"
        android:screenOrientation="portrait"
        android:theme="@android:style/Theme.Holo.Light.NoActionBar.Fullscreen"></activity>
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,我了解如何拥有该应用程序的 1 个实例。这就是你所描述的。但这并不能完全回答我关于如何在单击深层链接之前保留原始静态对象的问题。 (3认同)