原
后退导航是用户在之前访问过的屏幕历史中向后移动的方式。所有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
公众号推荐:
转载于:https://blog.51cto.com/4789781/2178011