ActionBar向上导航重新创build父活动,而不是onResume
我使用上推导航的推荐方法,我的代码如下所示:
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: Intent h = new Intent(ShowDetailsActivity.this, MainActivity.class); h.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(h); return true; default: return super.onOptionsItemSelected(item); } }
这是用例:
- 我启动我的应用程序,这是“MainActivity”
- 我点击一个button去“ShowDetailsActivity”
- 我点击UP的ActionBar导航
问题出在我点击UP之后,MainActivity再次触发了onCreate()方法,失去了所有状态,而不是像典型的onResume()那样开始,就像从ShowDetailsActivity调用“finish()”一样。 为什么? 这是如何总是工作,这是Android的预期行为重新创build导航到使用“向上”导航方法的所有活动? 如果我点击后退button,我会得到预期的onResume生命周期。
这是我的解决scheme,如果Android“适当”的不存在:
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: Intent upIntent = new Intent(this, MainActivity.class); if (NavUtils.shouldUpRecreateTask(this, upIntent)) { NavUtils.navigateUpTo(this, upIntent); finish(); } else { finish(); } return true; default: return super.onOptionsItemSelected(item); } }
将以下内容添加到清单文件中的父级活动
android:launchMode="singleTop"
关于这个答案
原因是,使用向上导航时重新创build的活动是,如果您没有指定其他模式,则android使用标准启动模式。 这意味着
“系统总是在目标任务中创build一个新的活动实例”
并因此活动被重新创build(参见文档)。
解决办法是声明MainActivity的启动模式为
android:launchMode="singleTop"
在AndroidManifest.xml
(应始终与Intent.FLAG_ACTIVITY_CLEAR_TOP
一起使用)
或者您可以将FLAG_ACTIVITY_SINGLE_TOP
添加到您的意图标志,告诉活动,如果它在后面的堆栈上,不应该重新创build,例如
Intent h = NavUtils.getParentActivityIntent(this); h.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); NavUtils.navigateUpTo(this, h);
这段代码适用于我:
Intent upIntent = NavUtils.getParentActivityIntent(this); if (NavUtils.shouldUpRecreateTask(this, upIntent)) { // This activity is NOT part of this app's task, so create a new task // when navigating up, with a synthesized back stack. TaskStackBuilder.create(this) // Add all of this activity's parents to the back stack .addNextIntentWithParentStack(upIntent) // Navigate up to the closest parent .startActivities(); } else { // This activity is part of this app's task, so simply // navigate up to the logical parent activity. upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); NavUtils.navigateUpTo(this, upIntent); } return true;
不需要完成()调用。
什么对我有用(而且我也认为最干净)是将活动重新sorting。 如果它不在堆栈中,则会在“导航”时创build。
Intent upIntent = NavUtils.getParentActivityIntent(this); upIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); startActivity(upIntent); finish(); return true;
你只需要回去,而不是再次创build活动。
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: super.onBackPressed(); return true; } return super.onOptionsItemSelected(item); }
从Android 4.1(API级别16)开始,您可以通过在元素中指定android:parentActivityName属性来声明每个活动的逻辑父项。 如果您的应用支持Android 4.0及更低版本,请在您的应用中添加支持库,并在其中添加一个元素。 然后指定父活动作为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" > <!-- Parent activity meta-data to support 4.0 and lower --> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.myfirstapp.MainActivity" /> </activity>
如果父活动具有启动模式,或者上层意图包含FLAG_ACTIVITY_CLEAR_TOP,则将父活动带到堆栈的顶部,并通过其onNewIntent()方法接收意图。
<activity android:launchMode="singleTop" android:name="com.example.myfirstapp.MainActivity"> </activity>
在上面的代码“SingleTop”中,还可以创build一个“singleTop”活动的新实例来处理新的意图。 但是,如果目标任务已经在堆栈顶部存在一个活动的现有实例,那么该实例将接收新的目标(在onNewIntent()调用中)。 一个新的实例不会被创build。
详细资料文件点击这里
要在用户按下应用程序图标时向上导航,可以使用NavUtils类的静态方法navigateUpFromSameTask()。 请阅读以上链接中的文档。
- Android:在web视图中禁用文本select
- Android ListView滚动到顶部
- Android支持库错误更新到23.3.0后
- 如何在android studio中启用Jack(Java Android编译器工具包)
- 如何以编程方式打开选项菜单?
- 在更新到新的Firebase之后获取Exception java.lang.NoClassDefFoundError:com.google.firebase.FirebaseOptions
- 获取android中button的背景颜色
- 在ActionBarSherlock强制溢出菜单
- BroadcastReceiver没有收到BOOT_COMPLETED