Mik*_*oos 31 android android-support-library
源代码可在此处获取:https://github.com/novemberox/NavigationTest此示例的修改版本:http://developer.android.com/training/implementing-navigation/ancestral.html
我有三个活动:
Main Activity 只是申请的主要入口Category Activity 它是详细活动的父级Detail ActivityMain Activity有打开的按钮Category Activity和Detail Activity.
Category Activty只有一个按钮打开Detail Activity.最后Detail Activity,它显示了一些文本,并具有模拟点击ActionBar的向上按钮.
我的"点击"路径是:
这是预期的流程,并且在Jelly Bean(在Galaxy Nexus 4.1.1和模拟器4.2 Google exppack上测试)之前,它在每个Android上运行良好.它甚至可以在ICS上运行.我正在使用支持库和类似NavUtils和TaskStackBuilder的类,就像我在开始时指出的示例一样.
在JB上单击"向上按钮"时,它返回到主活动状态,状态恢复正常.我查看了支持库的源代码,我看到该NavUtils.navigateUpTo方法调用本机JB代码Activity#navigateUpTo.我尝试了两个NavUtils#navigateUpTo()并且NavUtils.navigateUpFromSameTask()具有相同的不满意结果.
你有什么建议要做这个好流程吗?
cyf*_*r01 63
首先,如果您的目标设备与API 17(Android 4.2)一样高,请targetSdkVersion在清单中将其设置为17.这不会破坏对旧设备的支持,它只会使新设备正常工作.当然,这并不能解决你的问题 - 这样做很好.
我假设您的代码基于此页面上的祖先导航示例.您使用了第二个示例:
Intent upIntent = new Intent(this, MyParentActivity.class);
if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
// This activity is not part of the application's task, so create a new task
// with a synthesized back stack.
TaskStackBuilder.from(this)
.addNextIntent(new Intent(this, MyGreatGrandParentActivity.class))
.addNextIntent(new Intent(this, MyGrandParentActivity.class))
.addNextIntent(upIntent)
.startActivities();
finish();
} else {
// This activity is part of the application's task, so simply
// navigate up to the hierarchical parent activity.
NavUtils.navigateUpTo(this, upIntent);
}
Run Code Online (Sandbox Code Playgroud)
但是,对于您想要的行为,您需要替换NavUtils.navigateUpTo为:
upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(upIntent);
finish();
Run Code Online (Sandbox Code Playgroud)
通常,支持库试图近似在以后的API中引入的行为.在这种情况下NavUtils,支持库试图近似API 16(又称Android 4.1)中引入的行为.对于API 16之前的平台,NavUtils使用:
@Override
public void navigateUpTo(Activity activity, Intent upIntent) {
upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
activity.startActivity(upIntent);
activity.finish();
}
Run Code Online (Sandbox Code Playgroud)
这将查看后台堆栈中指定的活动实例upInent.如果找到一个,它会清除所有内容并恢复它.否则它只是启动活动.
在API 16+以后的平台上,支持库将事务移交给ActivityAPI中的本机调用.根据文件:
public boolean navigateUpTo(Intent upIntent)
从此活动导航到upIntent指定的活动,在此过程中完成此活动.如果upIntent指示的活动已存在于任务的历史记录中,则此活动以及历史堆栈中指示的活动之前的所有其他活动将完成.
如果指示的活动未出现在历史堆栈中,则此操作将完成此任务中的每个活动,直到达到任务的根活动,从而导致"应用程序内主页"行为.当可以通过不通过规范父活动的路径到达活动时,这在具有复杂导航层次结构的应用程序中非常有用.
从那时起,不清楚它是否会启动指定的活动,upIntent如果它不在后栈中.阅读源代码也无助于澄清事情.但是,根据您的应用显示的行为判断,它似乎不会尝试启动该upIntent活动.
无论哪种实现是对还是错,最终结果都是您需要FLAG_ACTIVITY_CLEAR_TOP行为,而不是本机API 16行为.不幸的是,这意味着您必须复制支持库近似值.
免责声明:我不为谷歌工作,所以这是我最好的猜测.
我的猜测是API 16+行为是预期的行为; 它是一个内置的实现,可以访问Android内部,并可以执行通过API无法实现的功能.在API 16之前,我认为除了使用意图标志之外,不能以这种方式展开backstack.因此,该FLAG_ACTIVITY_CLEAR_TOP标志是API 16之前平台可用的API 16行为的最接近的近似值.
不幸的是,结果是在本机实现和支持库实现之间违反了您的场景中最不惊讶的原则.这让我想知道这是否是API的意外使用.即,我想知道Android是否希望您遍历活动的完整导航路径,而不是直接跳转到它.
为了避免一种可能的误解,有人可能会期望shouldUpRecreateTask神奇地确定父母不在后面的堆栈中,然后使用TaskStackBuilder.来完成为你合成一切的过程.
但是,shouldUpRecreateTask基本上确定您的活动是由您的应用程序直接启动(在这种情况下它返回false),还是从其他应用程序启动(在这种情况下它返回true).从本书中,支持库检查意图的"动作"是否不是ACTION_MAIN(我不完全理解),而在API 16平台上,它根据任务亲和性执行此检查.不过,在这个应用程序的情况下,事情的结果是shouldUpRecreateTask返回false.
| 归档时间: |
|
| 查看次数: |
4847 次 |
| 最近记录: |