首页 文章

Android深层链接 - 后台堆栈

提问于
浏览
11

我正在尝试在我的Android应用程序中实现深层链接 . 我一直关注this guide . 我在Android清单中启动了Android活动并进行了intent-filter:

<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,但不确定它是如何工作的 .

也许我应该有一个中间Activity来构建主要活动,例如:

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

3 回答

  • 4

    我遇到了完全相同的问题 . 因此,如果您希望用户转到父活动,只要他们按下 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);
    }
    

    您可以在所有活动中执行相同操作,以不断地将用户导航回主屏幕 . 此外,您可以在导航用户之前创建完整的后台堆栈 . 请阅读以下文档中的更多内容 .

    Providing Up Navigation

    直接的解决方案

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

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

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

  • 4

    你试过这样做吗

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

    在深层链接的情况下,您必须构建自己的App堆栈 .

  • 1

    我一直在使用Android链接和应用程序索引功能深入链接,我希望这对索引应用程序页面很有用,并允许谷歌按照此处的指定抓取应用程序Deep link Guide

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

    此最佳实践适用于App索引API,因为您已从Android开发人员站点引用了App索引培训站点的deeplink链接 .

相关问题