原文地址: http://blog.sina.com.cn/s/blog_559357d20101bscp.html
Google Offical Docs :
Tasks and Back Stack Navigation with Back and Up
最近看到android文档上的Navigation这一块,可以说是基本针对android 4.0来说的,在android 4.1和4.2,实现已经简单了很多,下面就我自己的分析和实验说一下android 4.0以后的navigation。由于设计的内容比较多,所以可能会分几部分来写。
先介绍一下一些基本的概念。
1. ActionBar
2. Task and Back stack
一般来说(最简单普通的情况),一个app启动,会启动一个Task,然后在这个task里面按照堆栈的方式按照启动的顺序放入activity。举例来说,一个app,包含A, B, C, D四个Activity. 用户点击activity的顺序是A, B, C, B, D, 那么在task里面,从栈第到栈顶依次会是A, B, C, B, D这5个activity的instance。 这个时候,在D界面上点击back,D就会被弹出堆栈,android会显示activity B, 并且堆栈变为A, B, C, B.
3. Up and Back
在android导航中有两个基本的概念,一个是up,一个是back. 概念基本等同于windows资源管理器里面的后退和向上的概念。
点击左图,将会把当前的activity pop出task的堆栈,并且调用改activity的destroy方法。点击右图的话,将会显示当前Activity的父Activity.
基本上来说,我们不需要对back实现任何代码,android已经帮我们都做了,下面我们就来具体看看up的实现。
Android 4.0的Up实现
在android 4.0中,我们需要自己维护activity之间的父子关系。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
// This is called when the Home (Up) button is pressed
// in the Action Bar.
Intent parentActivityIntent = new Intent(this, MyParentActivity.class);
parentActivityIntent.addFlags(
Intent.FLAG_ACTIVITY_CLEAR_TOP |
Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(parentActivityIntent);
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
当然,android还给我们提供了utility方法实现这一功能,首先,我们要给activity添加如下属性:
<meta-data android:name="android.support.PARENT_ACTIVITY"
android:value=".ParentActivity" />
然后,在onOptionsItemSelected方法中,调用如下方法。
NavUtils.navigateUpFromSameTask(this);
Android 4.1的Up实现
在android4.1及以后的版本中,android已经帮我们完成了大部分的功能,只要给activity添加如下属性android:parentActivityName,android会自动维护activity之间的父子关系,我们不需要为up实现任何代码。
<activity android:name=".ChildActivity"
android:label="@string/child_label"
android:parentActivityName=".ParentActivity">
</activity>
另外补充一点,假设有如下Activity之间的关系
GrandParentActivity, ParentActivity, ChildActivity.
假设用户打开GrandParentActivity -> ChildActivity,这个时候,由于在task中并没有ParentActivity,及时用户点击了up,界面不会跳转到ParentActivity,而是GrandParentActivity,也就是父亲的祖先。