首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ActionBar向上导航将重新创建父活动,而不是onResume

ActionBar向上导航将重新创建父活动,而不是onResume
EN

Stack Overflow用户
提问于 2013-03-22 07:04:30
回答 5查看 19.7K关注 0票数 71

我使用的是Up Navigation推荐的方法,我的代码如下:

代码语言:javascript
复制
@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);
    }
}

以下是用例:

单击按钮转到"ShowDetailsActivity"

  • I单击UP ActionBar

启动我的应用程序

问题是,在我单击UP之后,MainActivity再次命中它的onCreate()方法,并丢失了所有状态,而不是像我从ShowDetailsActivity调用"finish()“那样从典型的onResume()开始。为什么?这就是它的工作方式吗?这是Android重新创建使用“向上”导航方法导航到的所有活动的预期行为吗?如果我点击后退按钮,我会得到预期的onResume生命周期。

这是我的解决方案,如果Android“合适的”不存在:

代码语言:javascript
复制
@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);
    }
}
EN

回答 5

Stack Overflow用户

发布于 2014-02-14 20:08:08

将以下内容添加到清单文件中的父活动中

代码语言:javascript
复制
android:launchMode="singleTop"

关于这个answer

票数 93
EN

Stack Overflow用户

发布于 2013-08-26 14:49:45

这段代码对我来说很有效:

代码语言:javascript
复制
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;

不需要调用finish()。

票数 12
EN

Stack Overflow用户

发布于 2015-06-14 15:43:44

从Android4.1 (API级别16)开始,您可以通过在元素中指定android:parentActivityName属性来声明每个活动的逻辑父元素。如果您的应用程序支持Android 4.0及更低版本,请在应用程序中包含Support Library,并在中添加一个元素。然后指定父活动作为android.support.PARENT_ACTIVITY的值,匹配android:parentActivityName属性。

代码语言:javascript
复制
<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>

如果父活动具有启动模式,或者up意图包含FLAG_ACTIVITY_CLEAR_TOP,则父活动将被带到堆栈的顶部,并通过其onNewIntent()方法接收意图。

代码语言:javascript
复制
<activity
        android:launchMode="singleTop"
        android:name="com.example.myfirstapp.MainActivity">

    </activity>

在上面的代码"SingleTop“中,还可以创建"singleTop”活动的新实例来处理新的意图。但是,如果目标任务的堆栈顶部已经有活动的现有实例,则该实例将接收新的意图(在onNewIntent()调用中);不会创建新的实例。

For Detail Documentation Click Here

要在用户按下应用程序图标时向上导航,您可以使用NavUtils类的静态方法navigateUpFromSameTask().来读取上面链接中给出的文档。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15559838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档