Android 深度链接 - 回栈

Posted

技术标签:

【中文标题】Android 深度链接 - 回栈【英文标题】:Android deep linking - Back stack 【发布时间】:2014-08-07 19:21:47 【问题描述】:

我正在尝试在我的 android 应用程序中实现深度链接。我一直在关注this guide。我有一个 Android Activity,它从 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>

我从 adb 产生了这个意图:

adb shell am start -W -a android.intent.action.VIEW -d "com.example://test" com.example

正在使用正确的意图数据创建活动并按预期运行。但是,按下后退按钮时,应用程序将退出。我期待使用MainActivity 构建后台堆栈,正如Android 清单中的parentActivityName 所指定的那样。显然不是这样的。

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

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

也许我应该有一个中间活动来使用类似的东西来构建主要活动:

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

?

【问题讨论】:

我有一个非常相似的问题。你找到解决办法了吗?我认为您建议的方式可行,但似乎中间活动是解决它的粗略方式。 @Gak2 我目前仍在使用中间活动。如果您找到替代方案,请告诉我。 【参考方案1】:

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

@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);

您可以在所有活动中执行相同的操作,以不断将用户导航回主屏幕。此外,您可以在导航用户返回之前创建完整的返回堆栈。阅读以下文档了解更多信息。

Providing Up Navigation

直截了当的解决方案

您可以通过调用isTaskRoot() 简单地检查深层链接的活动是否有返回堆栈以返回应用程序的任务本身。我不太确定它是否有任何警告。

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

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

【讨论】:

优雅的解决方案,但在某些情况下,您想将 ChildActivity 显示给用户,如果 ParentActivity 没有运行,则按下返回会将用户带到上一个任务/启动器。【参考方案2】:

您是否尝试过这样做,

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

您必须构建自己的应用程序堆栈以防深层链接。

【讨论】:

【参考方案3】:

我一直在为 Android 的应用程序链接和应用程序索引功能工作,具有深度链接的基础, 我希望这对索引应用页面有用,并允许 google 按照此处指定的方式抓取应用 Deep link Guide

我在深度链接和应用程序索引中研究的主要规则是为从搜索或某处启动的用户提供首次点击免费体验。不应包含任何登录/注册页面。 但是 onBack 按钮按下事件必须返回到搜索结果或起源位置而不是您的父活动。 来源App indexing Best practices and Important

此最佳实践适用于 App indexing API,因为您已从 Android 开发者网站引用了 App indexing Training 网站的深层链接。

【讨论】:

首次点击免费体验+1。我最终删除了 PARENT_ACTIVITY 标志,以使应用程序流程有意义。 developer.android.com/guide/navigation/… 创建一个后台堆栈,以便深层链接将您带到目标页面,就像您从“开始”屏幕导航到那里一样。

以上是关于Android 深度链接 - 回栈的主要内容,如果未能解决你的问题,请参考以下文章

Android - 清除导航回栈

Android导航组件回栈

如何在 Android 应用程序中查找回栈活动?

Android Fragment 回栈的问题

Android中维护标准应用Activity回栈状态(使用singleTask启动模式)

图片模式下 Android O 图片的任务列表和回栈