【问题标题】:Android: make sure that specific activity retains in backstackAndroid:确保特定活动保留在后台堆栈中
【发布时间】:2016-11-30 01:40:38
【问题描述】:

我想让每个活动在后台堆栈中只有一个主要活动启动,所以我总是可以使用后退按钮返回到主要活动,例如(对于开始活动我使用 startActivity()):

  1. Main Activity - Activity1(后按)返回到 Main 活动
  2. 主 Activity - Activity1 - Activity2(后按)也 返回主活动

看起来我需要在启动每个新活动时使用 FLAG_ACTIVITY_CLEAR_TASK 标志,但它也会清除主活动。我试过 FLAG_ACTIVITY_CLEAR_TOP1st 情况下工作正常,但在 2nd 情况下不行。

如果有人遇到同样的问题,请帮忙。任何想法表示赞赏!谢谢!


我的主要活动:

        <activity
        android:name=".activity.main.MainActivity"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        android:configChanges="orientation|keyboardHidden"
        android:launchMode="singleTop">

        <meta-data
            android:name="android.app.default_searchable"
            android:value=".activity.search.SearchActivity" />

    </activity>

【问题讨论】:

  • 您只需要后台的 mainActivity 吗?仅在 mainActivity 后按后不应该打开其他活动吗?对吗?
  • 不知道这是否有效,但也许尝试在开始新活动时对每个不是您的主要活动的活动调用 this.finish()?
  • 你也在使用Fragments吗?
  • 我认为您应该将活动 1 和 2 的父活动设置为 MainActivity android:parentActivityName=".activity.main.MainActivity" 链接 developer.android.com/training/implementing-navigation/…
  • @EmmanuelMtali 谢谢,它对我有用!

标签: android android-intent android-activity


【解决方案1】:

在 onBackPressed() 中触发 Main Activity 的 Intent 时设置 FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY 标志。

【讨论】:

    【解决方案2】:

    只要确保在Activity1 启动Activity2 时调用finish()。这将确保您的任务堆栈如下所示:MainActivity->Activity2。

    【讨论】:

      【解决方案3】:

      正如@EmmanuelMtali 提到的,出于这个原因,我使用了父活动。

      1. 对于不同于 Main 的活动,我将 meta-data(和 android:parentActivityNameAPI > 16)设置如下:

            <activity
            android:name=".activity.user.LoginActivity"
            android:screenOrientation="portrait"
            android:configChanges="orientation|keyboardHidden"
            android:launchMode="singleTop"
            android:parentActivityName=".activity.main.MainActivity">
        
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".activity.main.MainActivity" />
        </activity>
        
      2. 当我需要开始新的活动时,我会使用意图数组和 startActivities() 方法:

        public static Intent[] createIntentsWithMainActivityInStack(Context context, Intent topMostIntent) {
        TaskStackBuilder taskStackBuilder = TaskStackBuilder.create(context);
        topMostIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
        
        Intent[] intents =
                taskStackBuilder
                        .addNextIntentWithParentStack(topMostIntent)
                        .getIntents();
        
        return intents; }
        

      Intent[] intents = createIntentsWithMainActivityInStack(context, new Intent(context, LoginActivity.class));
      startActivities(intents);
      

      【讨论】:

        【解决方案4】:

        在每个活动中尝试此操作,以便在您后按时打开主要活动:

        @Override
            public void onBackPressed()
            {
                super.onBackPressed();
                Intent intent = new Intent(ACTIVITYTHREE.this,MAINACTIVITY.class);
                startActivity(intent);
            }
        

        【讨论】:

        • 没有投票,但我认为是因为它不能完全回答问题。它加载新的主要活动并且不使用可能更改的实例状态
        • 这是实现这一目标的可怕方式。不,我也没有投反对票。
        猜你喜欢
        • 1970-01-01
        • 2011-01-04
        • 2012-10-14
        • 1970-01-01
        • 2011-11-20
        • 2012-12-16
        • 2011-01-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多