Android 安卓深度链接回栈

Android 安卓深度链接回栈,android,android-intent,android-activity,deep-linking,back-stack,Android,Android Intent,Android Activity,Deep Linking,Back Stack,我正在尝试在我的Android应用程序中实现深度链接。我一直在跟踪。我有一个安卓活动,它是从安卓清单中的目的过滤器开始的: <activity android:name=".MyActivity" android:parentActivityName=".MainActivity" > <intent-filter android:label="@string/filter_title_deep_link"> <action

我正在尝试在我的Android应用程序中实现深度链接。我一直在跟踪。我有一个安卓活动,它是从安卓清单中的目的过滤器开始的:

<activity
    android:name=".MyActivity"
    android:parentActivityName=".MainActivity" >
    <intent-filter android:label="@string/filter_title_deep_link">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="com.example" />
    </intent-filter>
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value=".MainActivity"/>
</activity>
正在使用正确的意图数据创建活动,并按预期运行。但是,按下后退按钮时,应用程序退出。我原本希望使用Android清单中的
parentActivityName
指定的
MainActivity
构建后堆栈。显然情况并非如此

在这种情况下,如何将父活动添加到后堆栈

我想知道是否可以使用通知上下文中显示的
TaskStackBuilder
,但不确定它将如何工作

也许我应该有一个中间活动来构建主要活动,使用以下内容:

TaskStackBuilder.create(this)
                .addParentStack(MyActivity.class)
                .addNextIntent(new Intent(this, MyActivity.class))
                .startActivities();

我一直在为Android的应用链接和应用索引功能工作,其基础是深度链接, 我希望这是有用的索引应用程序页面,并允许谷歌抓取的应用程序指定在这里

  • 我在深度链接和应用程序索引中研究的主要规则是,为从搜索或其他地方启动的用户提供首次点击免费体验,并且不应包含任何登录/注册页面。 但是,返回按钮按下事件必须返回到搜索结果或原始位置,而不是您的父活动。 来源

这一最佳实践适用于应用程序索引API,因为您已经从Android开发者网站引用了应用程序索引培训网站的deeplink链接。

您尝试过这样做吗

Intent intent = new Intent(this, MyActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addNextIntentWithParentStack(intent);
stackBuilder.startActivities();

你必须构建自己的应用程序堆栈,以防出现深度链接。

我遇到了完全相同的问题。因此,如果希望用户转到父活动,只要他们按下
UP
按钮,就可以在
AndroidManifest.xml
中定义父活动,然后以编程方式控制向上导航

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    // Respond to the action bar's Up/Home button
    case android.R.id.home:
        NavUtils.navigateUpFromSameTask(this);
        return true;
    }
    return super.onOptionsItemSelected(item);
}

@Override
public void onBackPressed() {
    NavUtils.navigateUpFromSameTask(this);
}
您可以在所有活动中执行相同的操作,以不断将用户导航回主屏幕。此外,您可以在导航用户返回之前创建完整的返回堆栈。请阅读以下文档中的更多内容

直截了当的解决办法 通过调用
isTaskRoot()
,您可以简单地检查深度链接活动是否有返回到应用程序任务本身的后台堆栈。不过,我不太确定它是否有任何警告

@Override
public void onBackPressed() {
    if(isTaskRoot()) {
        Intent parentIntent = new Intent(this, ParentActivity.class);
        startActivity(parentIntent);
        finish();
    } else {
        super.onBackPressed();
    }
}

在这种情况下,您实际上不必在Android清单中声明父活动。

我遇到了一个非常类似的问题。你找到解决办法了吗?我认为你建议的方法会起作用,但中间活动似乎是解决问题的一种粗糙方法。@Gak2我目前仍在使用中间活动。如果你有其他选择,请告诉我。第一次点击免费体验+1。我最终删除了PARENT_活动标志,以使应用程序流有意义。创建一个backback,这样一个深度链接就可以将您带到目标页面,就像您从“开始”屏幕导航到目标页面一样。优雅的解决方案,但有时您希望向用户显示ChildActivity,如果ParentActivity未运行,则按back键会将用户带到上一个任务/启动器。
@Override
public void onBackPressed() {
    if(isTaskRoot()) {
        Intent parentIntent = new Intent(this, ParentActivity.class);
        startActivity(parentIntent);
        finish();
    } else {
        super.onBackPressed();
    }
}