Android 深度链接 - 返回堆栈

标签 android android-intent android-activity deep-linking back-stack

我正在尝试在我的 Android 应用程序中实现深度链接。我一直在关注this guide .我有一个从 Android list 中的 intent-filter 开始的 Android Activity :

<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 产生这个 Intent :

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

正在使用正确的 Intent 数据创建 Activity 并按预期运行。但是,在按下后退按钮时,应用程序退出。我期望使用 MainActivity 构建返回堆栈,如 Android list 中的 parentActivityName 所指定。显然情况并非如此。

在这种情况下,如何将父 Activity 添加到返回堆栈?

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

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

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

?

最佳答案

我遇到了完全相同的问题。因此,如果您希望用户在按下 UP 按钮时转到您的父 Activity ,您可以在 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);
}

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

Providing Up Navigation

直接的解决方案

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

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

在这种情况下,您实际上不必在 Android list 中声明父 Activity 。

关于Android 深度链接 - 返回堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24269588/

相关文章:

android - 如何通过单击通知关闭我的应用程序的任何 Activity ?

android - android 上的 USB 类

android - 加载位图时出现 "BitmapFactory.decodeResource"应用程序崩溃

java - 如何使用加速度计值显示数字

android - 如何将支持库中的操作栏添加到 PreferenceActivity?

Android 下载 pdf 到内部存储并启动 intent

android - 意向 Pebble 应用商店

Android - 使用 intent uri 从命令行启动 Activity

android - 覆盖 Activity 布局的 fragment

java - 当我开始另一个 Activity 时如何停止可运行的 Activity ?