我怎样才能正确回到父母的活动?

我在我的android应用程序中有2个活动(A和B),我使用从活动A到活动B的意图。启用了parent_activity的使用:

<activity android:name=".B" android:label="B" > <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.app_name.A" /> </activity> 

我也使用一个提供UPbutton的主题。

因此,在我调用活动后,BI可以使用UPbutton返回活动A.问题是应用程序似乎再次调用活动A的onCreate()函数,这不是我需要的行为。 我需要活动A,就像之前看到的那样,我称之为活动B.

有没有办法做到这一点?

提前致谢

编辑:

我没有写任何代码来从活动A开始活动B.我认为它是由eclipse自动生成的。

B类看起来像:

  @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_b); getActionBar().setDisplayHomeAsUpEnabled(true); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_b, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: NavUtils.navigateUpFromSameTask(this); return true; } return super.onOptionsItemSelected(item); } 

您使用Android清单中的标准launchMode声明了活动A. 根据文件 ,这意味着以下内容:

系统总是在目标任务中创build一个活动的新实例,并将意图发送给它。

因此,即使任务堆栈被正确处理,系统也被迫重新创build活动A(即调用onCreate )。

要解决此问题,您需要更改清单,将以下属性添加到A活动声明中:

 android:launchMode="singleTop" 

注意:调用finish() (正如之前的解决scheme所build议的那样) 在您完全确定您正在终止的活动B实例位于活动A的实例之上时才起作用。在更复杂的工作stream中(例如,从一个通知),这可能不是这种情况,你必须从B正确地启动活动A.

更新的答案:向上导航devise

您必须声明哪个活动是每个活动的适当的父项。 这样做可以使系统便于导航模式(如Up),因为系统可以从清单文件中确定逻辑父活动。

所以为此,你必须在标签Activity中声明你的父Activity

android:parentActivityName

喜欢,

 <!-- The main/home activity (it has no parent activity) --> <activity android:name="com.example.app_name.A" ...> ... </activity> <!-- A child of the main activity --> <activity android:name=".B" android:label="B" android:parentActivityName="com.example.app_name.A" > <!-- Parent activity meta-data to support 4.0 and lower --> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.app_name.A" /> </activity> 

通过这种方式声明父级活动,您可以导航到如下所示的适当父级,

 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { // Respond to the action bar's Up/Home button case android.R.id.home: NavUtils.navigateUpFromSameTask(this); return true; } return super.onOptionsItemSelected(item); } 

所以当你调用NavUtils.navigateUpFromSameTask(this); 此方法完成当前活动并启动(或恢复)适当的父活动。 如果目标父活动位于任务的后退堆栈中,则按照FLAG_ACTIVITY_CLEAR_TOP定义前进。

而要显示向上button,你必须声明setDisplayHomeAsUpEnabled():

 @Override public void onCreate(Bundle savedInstanceState) { ... getActionBar().setDisplayHomeAsUpEnabled(true); } 

旧答案:(不支持导航,默认后退导航)

只有当你从Activity B重新开始Activity A时才会发生。

使用startActivity()

而不是从Activity A开始,使用startActivityForResult()开始Activity B,并在Activity A中重写onActivtyResult()

现在在活动B中,只需在buttonUp上调用finish() 。 所以现在你直接指向Activity A的onActivityResult()而不用再​​创buildActivity A了。

我有几乎相同的设置导致相同的不需要的行为。 对我来说,它在我的应用程序的Manifest.xml中的活动A中添加了以下属性:

机器人:launchMode = “singleTask”

有关说明,请参阅http://www.peachpit.com/articles/article.aspx?p=1874864

虽然这是一个老问题,但是由于我从Widget中 链接了Activity B ,因此以前的所有答案都不适用于我,所以这里是另一个(最好的,最好的)解决scheme。

 public void navigateUp() { final Intent upIntent = NavUtils.getParentActivityIntent(this); if (NavUtils.shouldUpRecreateTask(this, upIntent) || isTaskRoot()) { Log.v(logTag, "Recreate back stack"); TaskStackBuilder.create(this).addNextIntentWithParentStack(upIntent).startActivities(); } else { NavUtils.navigateUpTo(this, upIntent); } } 

[ https://stackoverflow.com/a/31350642/570168 ]

但是也请参阅: https : //speakerdeck.com/jgilfelt/this-way-up-implementing-effective-navigation-on-android

实现这一点的更好的方法是使用两件事:call:

 NavUtils.navigateUpFromSameTask(this); 

现在,为了这个工作,你需要让清单文件声明活动A有一个父活动B.父活动不需要任何东西。 在版本4和更高版本中,您将获得一个不错的后退箭头(没有额外的努力)(这可以在较低的版本中完成,也可以使用一些代码,下面将介绍)您可以在manifest-> application选项卡中设置这些数据在GUI中(向下滚动到父活动名称,并手工放置)

支持节点:

如果您希望支持版本4以下的版本,则还需要包含元数据。 右键单击活动,添加 – >元数据,名称= android.support.PARENT_ACTIVITY和值= your.full.activity.name

在较低版本中也可以获得漂亮的箭头:

 getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

请注意,您将需要支持库版本7来获得这一切工作,但它是非常值得的!

我有一个类似的问题,使用android 5.0与一个坏的父活动名称

 <activity android:name=".DisplayMessageActivity" android:label="@string/title_activity_display_message" android:parentActivityName=".MainActivity" > <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.myfirstapp.MainActivity" /> </activity> 

我从父活动名称中删除了com.example.myfirstapp,它工作正常

我试过android:launchMode="singleTask" ,但没有帮助。 为我使用android:launchMode="singleInstance"

添加到@ LorenCK的答案,改变

 NavUtils.navigateUpFromSameTask(this); 

到下面的代码如果您的活动可以从其他活动启动,这可以成为一些其他应用程序启动的任务的一部分

 Intent upIntent = NavUtils.getParentActivityIntent(this); if (NavUtils.shouldUpRecreateTask(this, upIntent)) { TaskStackBuilder.create(this) .addNextIntentWithParentStack(upIntent) .startActivities(); } else { NavUtils.navigateUpTo(this, upIntent); } 

这将开始一个新的任务,并启动您的活动的父活动,您可以在清单中定义如下面的Min SDK版本<= 15

 <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.app_name.A" /> 

或者,如果它> 15,使用parentActivityName

添加到具有属性的活动清单信息

 android:launchMode="singleTask" 

对我来说效果不错

什么对我有用补充说:

  @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: onBackPressed(); return true; default: return super.onOptionsItemSelected(item); } } @Override public void onBackPressed() { finish(); } 

TheRelevantActivity.java ,现在它按预期工作

是的,不要忘记补充:

getSupportActionbar.setDisplayHomeAsUpEnabled(true);onCreate()方法中

尝试这个:

 Intent intent; @Override public void onCreate(Bundle savedInstanceState) { intent = getIntent(); super.onCreate(savedInstanceState); setContentView(R.layout.activity_b); getActionBar().setDisplayHomeAsUpEnabled(true); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_b, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: NavUtils.navigateUpTo(this,intent); return true; } return super.onOptionsItemSelected(item); } 
  @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { // Respond to the action bar's Up/Home button case android.R.id.home: finish(); return true; } return super.onOptionsItemSelected(item); 

像一个后退button

进入我的清单,并添加android:launchMode="singleTop"的活动做了我的伎俩。

这特别解决了我的问题,因为我不希望Android在点击工具栏中的“ Upbutton之后创build前一个活动的新实例 – 而是想在上导航层次结构时使用先前活动的现有实例。

参考: android:launchMode

在Java类中: –

  toolbar = (Toolbar) findViewById(R.id.apptool_bar); setSupportActionBar(toolbar); getSupportActionBar().setTitle("Snapdeal"); getSupportActionBar().setHomeButtonEnabled(true); getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

在清单中: –

 <activity android:name=".SubActivity" android:label="@string/title_activity_sub" android:theme="@style/AppTheme" > <meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".MainActivity"></meta-data> </activity> 

它会帮助你

在活动中使用finish()以便在点击事件中返回。