【Interface&navigation】提供适当的后退导航(65)


后退导航是用户在之前访问过的屏幕历史中向后移动的方式。所有Android设备都为此类导航提供了“ 后退”按钮,因此您的应用不应向UI添加“后退”按钮。

在几乎所有情况下,当用户导航您的应用程序时,系统会维护一系列活动。这允许系统在用户按下后退按钮时正确地向后导航。但是,在某些情况下,您的应用应手动指定Back行为,以便提供最佳用户体验。

另请参阅设计后退和上导航, 任务和后台堆栈以及 Android设计:导航。
需要您手动指定Back行为的导航模式包括:

当用户直接从通知,应用程序窗口小部件或导航抽屉输入深层活动时。
用户在片段之间导航的某些情况。
当用户导航网页时WebView。
以下各节介绍了如何在这些情况下实现正确的后退导航。

为Deep Links合成新的Back Stack


通常,当用户从一个活动导航到下一个活动时,系统递增地构建后向堆栈。但是,当用户使用深度链接进入应用程序并在其自己的任务中启动活动时,您需要合成新的后备堆栈,因为活动在新任务中运行而根本没有任何后备堆栈。

例如,当通知将用户带到应用程序层次结构深处的活动时,您应该将活动添加到任务的后台堆栈中,以便按Back返回导航应用程序层次结构而不是退出应用程序。导航设计指南中进一步描述了此模式 。

在清单中指定父活动


从Android 4.1(API级别16)开始,您可以通过android:parentActivityName在<activity>元素中指定属性来声明每个活动的逻辑父级。这允许系统便于导航模式,因为它可以使用此信息确定逻辑“ 后”或“ 上”导航路径。

如果您的应用支持Android 4.0及更低版本,请在 您的应用中添加支持库,并在其中添加<meta-data> 元素<activity>。然后将父活动指定为android.support.PARENT_ACTIVITY匹配android:parentActivityName属性的值。

例如:

<application ... >
    ...
    <!-- The main/home activity (it has no parent activity) -->
    <activity
        android:name="com.example.myfirstapp.MainActivity" ...>
        ...
    </activity>
    <!-- A child of the main activity -->
    <activity
        android:name="com.example.myfirstapp.DisplayMessageActivity"
        android:label="@string/title_activity_display_message"
        android:parentActivityName="com.example.myfirstapp.MainActivity" >
        <!-- The meta-data element is needed for versions lower than 4.1 -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myfirstapp.MainActivity" />
    </activity>
</application>

通过以这种方式声明父活动,您可以使用 NavUtilsAPI通过确定哪个活动是每个活动的适当父级来合成新的后备堆栈。

启动活动时创建后台堆栈

将活动添加到后台堆栈的过程始于将用户带入您的应用程序的事件。也就是说startActivity(),使用 TaskStackBuilderAPI来定义应放入新后台堆栈的每个活动,而不是调用。然后通过调用开始目标活动startActivities(),或通过调用创建适当PendingIntent的活动getPendingIntent()。

例如,当通知将用户带到应用程序层次结构深处的活动时,您可以使用此代码创建PendingIntent 启动活动并将新的后备堆栈插入目标任务:

// Intent for the activity to open when user selects the notification 
Intent detailsIntent = new Intent(this, DetailsActivity.class);

// Use TaskStackBuilder to build the back stack and get the PendingIntent 
PendingIntent pendingIntent =
        TaskStackBuilder.create(this)
                        // add all of DetailsActivity's parents to the stack, 
                        // followed by DetailsActivity itself 
                        .addNextIntentWithParentStack(detailsIntent)
                        .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);

NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setContentIntent(pendingIntent);
... 

结果PendingIntent不仅指定要启动的活动(由定义detailsIntent),还指定应插入任务的后备堆栈(DetailsActivity定义的所有父项detailsIntent)。因此,当DetailsActivity开始时,按Back会 向后导航每个DetailsActivity类的父活动。
注意:为了使addNextIntentWithParentStack() 方法起作用,您必须使用如上所述的android:parentActivityName属性(和相应的<meta-data>元素)声明清单文件中每个活动的逻辑父级 。

实现碎片的后退导航

在应用程序中使用片段时,单个FragmentTransaction 对象可能表示应添加到后台堆栈的上下文更改。例如,如果要通过交换片段在手机上实现主/详细信息流,则应确保按详细信息屏幕上的“ 返回”按钮可将用户返回到主屏幕。为此,请addToBackStack()在提交事务之前调用:

// Works with either the framework FragmentManager or the
// support package FragmentManager (getSupportFragmentManager).
getSupportFragmentManager().beginTransaction()
                           .add(detailFragment, "detail")
                           // Add this transaction to the back stack
                           .addToBackStack(null)
                           .commit();

当FragmentTransaction后台堆栈上有对象并且用户按下后退按钮时,会FragmentManager从后台堆栈中弹出最近的事务并执行相反的操作(例如,如果事务添加了片段,则删除片段)。
注意:您不应该添加交易后堆在事务的水平导航(调整过滤器时,如)或修改内容时的外观(如切换标签时)。有关何时适合返回导航的详细信息,请参阅导航设计指南。

如果应用程序更新其他用户界面元素以反映片段的当前状态(例如操作栏),请记住在提交事务时更新UI。除了提交事务之外,您应该在后台堆栈更改后更新用户界面。您可以FragmentTransaction 通过设置以下内容来监听恢复时间FragmentManager.OnBackStackChangedListener:

getSupportFragmentManager().addOnBackStackChangedListener(
        new FragmentManager.OnBackStackChangedListener() {
            public void onBackStackChanged() {
                // Update your UI here.
            }
        });

实现WebViews的后退导航


如果您的应用程序的一部分包含在a中WebView,则可能适合返回遍历浏览器历史记录。为此,您可以覆盖onBackPressed()并代理 WebView它是否具有历史状态:

@Override
public void onBackPressed() {
    if (mWebView.canGoBack()) {
        mWebView.goBack();
        return;
    }

    // Otherwise defer to system default behavior.
    super.onBackPressed();
}

将此机制与高度动态的网页结合使用时要小心,这些网页可能会增长很长的历史。生成大量历史记录的页面(例如频繁更改文档哈希值的页面)可能会使用户退出您的活动变得乏味。

有关使用的更多信息WebView,请阅读在WebView中构建Web应用程序。

联系我

QQ:94297366
微信打赏:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ

公众号推荐:

【Interface&navigation】提供适当的后退导航(65)

转载于:https://blog.51cto.com/4789781/2178011

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值