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); } } 

这是用例:

  1. 我启动我的应用程序,这是“MainActivity”
  2. 我点击一个button去“ShowDetailsActivity”
  3. 我点击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()。 请阅读以上链接中的文档。