如何从网址链接(深层链接)重新打开(或恢复)之前发布的活动?

时间:2015-12-28 20:41:43

标签: android android-intent android-activity android-manifest android-lifecycle

我正在使用深层链接打开我的应用,这是意图过滤器:

        <intent-filter>
            <data android:scheme="http" />
            <data android:scheme="https" />
            <data android:host="myapp.delivery" />
            <data android:pathPattern="/.*" />

            <action android:name="android.intent.action.VIEW" />

            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
        </intent-filter>

我们的用例是:

  1. 用户打开应用,浏览一些餐馆
  2. 用户点击餐厅(用餐馆菜单打开MenuActivity活动)
  3. 用户点击菜单类别,例如Pizzas或Desserts或Soups,打开CategoryActivity。
  4. 用户点击菜单添加到购物车我需要向用户发送带有网址的电子邮件。
  5. 我的问题:

    (在第4步之后)用户点击电子邮件应用(例如gmail或收件箱应用)上的网址,提示用户打开我的应用或浏览器,如下所示:

    enter image description here

    当用户点击使用我的应用程序打开时,会发生GotEmailActivity在gmail应用程序之上打开,我需要它在我之前打开的应用程序实例之上打开。

    正如您在此处所见,我的应用程序的2个实例已打开(第一个应用实例,第二个实例在gmail之上打开),:

    enter image description here

    如何在我以前推出的应用中打开点击链接,而不是在gmail / inbox应用程序之上?

2 个答案:

答案 0 :(得分:5)

我找到的答案

所以我创建了在gmail / inbox app上启动的EntryActivity:

public class EntryActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.entry_activity);

        Uri uriParams = getIntent().getData();

        Log.e("EntryActivity", uriParams.getHost() );
        Log.e("EntryActivity", uriParams.getQueryParameter("uid") + " " + uriParams.getQueryParameter("type") + " " + uriParams.getQueryParameter("token") );


        Intent startCategory = new Intent(this, GotEmailActivity.class);
        startCategory.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(startCategory);
        this.finish();
    }

}

现在发生的事情是,在Gmail应用程序的顶部打开了EntryActivity,但它关闭了inmediatle,但首先启动已经打开的GotEmailActivity,因此属性launchMode Singletop会阻止此类活动的新实例。

然后当我的应用程序在GotEmailActivity上打开时,我发送电子邮件给用户,其中包含打开应用程序的链接,而GotEmailActivity在AndroidManifest中有属性android:launchMode="singleTop",因此只打开了1个实例:

    <!-- 
        Important: notice android:launchMode="singleTop"
        which seeks if an instance of this activity is already opened and
        resumes already opened instance, if not it opens new instance.
     -->
    <activity
        android:name=".presenters.register.email.GotEmailActivity"
        android:label="@string/title_activity_got_email"
        android:launchMode="singleTop" 
        android:theme="@android:style/Theme.Translucent.NoTitleBar" >

答案的优点是:https://stackoverflow.com/a/34499615/5297353

答案 1 :(得分:0)

在 AndroidManifest.xml 中设置此代码

android:launchMode="singleTask"

在标签活动中

<activity
        android:name=".ui.live.liveinfo.LiveInfoActivity"
        android:clearTaskOnLaunch="true"
        android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation|keyboardHidden"
        android:launchMode="singleTask"
        android:parentActivityName=".ui.main.MainActivity"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />

            <category android:name="android.intent.category.BROWSABLE" />
            <category android:name="android.intent.category.DEFAULT" />

            <data
                android:host="playpod.ir"
                android:pathPrefix="/lives/live"
                android:scheme="https" />
        </intent-filter>
    </activity>