Android深层链接 - 后台堆栈

Jon*_*n G 15 android deep-linking android-intent android-activity back-stack

我正在尝试在我的Android应用程序中实现深层链接.我一直在关注这个指南.我在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>
Run Code Online (Sandbox Code Playgroud)

我从adb产生这个意图:

adb shell am start -W -a android.intent.action.VIEW -d "com.example://test" com.example
Run Code Online (Sandbox Code Playgroud)

正在使用正确的意图数据创建活动,并按预期运行.但是,按下后退按钮后,应用程序退出.MainActivity正如parentActivityNameAndroid清单中所指出的那样,我期待构建后备栈.显然事实并非如此.

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

我想,如果我可以使用一个TaskStackBuilder如图所示这里在通知的情况下,但不知道它是如何工作的.

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

TaskStackBuilder.create(this)
                .addParentStack(MyActivity.class)
                .addNextIntent(new Intent(this, MyActivity.class))
                .startActivities();
Run Code Online (Sandbox Code Playgroud)

Sub*_*ian 10

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

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

提供导航

直接的解决方案

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

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

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


use*_*337 6

你试过这样做吗

Intent intent = new Intent(this, MyActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addNextIntentWithParentStack(intent);
stackBuilder.startActivities();
Run Code Online (Sandbox Code Playgroud)

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


小智 1

我一直在使用深度链接的基础来研究Android的应用程序链接和应用程序索引功能,我希望这对于索引应用程序页面并允许谷歌抓取此处指定的应用程序深度链接指南

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

此最佳实践适用于应用程序索引 API,因为您已从 Android 开发人员网站引用了来自应用程序索引培训网站的深层链接。