【问题标题】:Resume Activity after going to home page回到主页后恢复Activity
【发布时间】:2018-08-22 10:07:12
【问题描述】:

从我的 MainActivity(启动器活动)中,我按下一个按钮来启动我的 GameActivity。我有它,所以当我在游戏活动中点击后退按钮时,我不会返回我的 MainActivity 而是返回我的主屏幕。现在,当我恢复我的应用程序时,它会转到 MainActivity 而不是返回到 GameActivity 尽管显示。


目标

主活动 -> 游戏活动 -> 主页 -> 游戏活动

当前结果

主活动 -> 游戏活动 -> 主页 -> 主页活动


几件事..

  • 当我使用主页和菜单按钮进行导航时,它可以完美运行。
  • 我的清单中没有启动模式

让我们看看我做了什么!


主活动按钮点击

 Button startButton = findViewById(R.id.buttonStart);
    startButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(MainActivity.this, GameActivity.class);
            //stops back button to return to add player screen
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);

            startActivity(intent);

        }
    });

清单简化

 <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity
        android:name=".MainPage.MainActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar"
        android:screenOrientation="portrait"
        >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".GamePage.GameActivity"
        android:label="@string/title_activity_game"
        android:theme="@style/AppTheme.NoActionBar"
        android:screenOrientation="portrait" />
</application>

【问题讨论】:

  • 如何恢复您的应用程序? (步骤)
  • 我单击菜单按钮,它会出现,然后我用手指点击它。除此之外我一无所有。我认为它应该只是去正确的活动,因为其他堆栈被擦除了。
  • 这些是停止返回上一个活动的解决方案,它们不能解决问题或用我的方法恢复应用程序。这些答案也已在下面的 cmets 中提出,我尝试了您链接中评论的各种不同内容,结果没有变化。
  • 我认为您向下滚动链接的速度太快了,可能错过了 Asok 关于“android:launchMode”和 android 文档(“singleTask”或“singleInstance”)的回答,但是,无论如何,很高兴它适用于你。 :)

标签: android android-intent android-activity android-lifecycle back-stack


【解决方案1】:

在这种情况下,只需在启动 GameActivity 后立即调用 finish()。

Button startButton = findViewById(R.id.buttonStart);
    startButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(MainActivity.this, GameActivity.class);
            startActivity(intent);
            finish();
        }
    });

编辑:也为您的 GameActivity 更新 launchMode:

<activity android:name=".GameActivity" android:launchMode="singleInstance">

【讨论】:

  • 我实际上已经尝试过了,结果没有任何变化。
  • 我删除了意图标志,结果仍然相同。
  • 让我回顾一下:目前你想要这个流程:主活动 -> 游戏活动 -> 按返回按钮 -> 设备主屏幕 -> 按矩形按钮并选择应用程序 -> 游戏活动。我说的对吗?
  • 是的,你是正确的。
  • 好的,还有一步:为您的游戏活动添加启动模式。请看更新
【解决方案2】:

当您点击设备的后退按钮时,会调用 onBackPress 方法,您可以根据需要覆盖他以重定向用户,这意味着您可以更改后退按钮的操作,代码:

//When Back Button on click, it will come to this method.
@Override
public void onBackPressed() {
    //Do anything you want here, 
}

【讨论】:

  • 我会导航到什么地方?后退按钮将我从我的应用程序带到主页。
【解决方案3】:

使用传统的回栈机制似乎无法做到这一点。如果不先弹出后退堆栈中的所有活动(因此如果没有内存泄漏,则销毁它们),您无法使用后退按钮返回主屏幕。

然后,当您单击菜单按钮时,应该会显示您上次显示的 Activity 的屏幕截图,但由于您的所有 Activity 都已销毁,因此您的启动器 Activity 已加载。

您可以在选择时重新进入应用程序的一种方法是实现一个导航 Activity(在许多情况下是启动屏幕)作为启动器 Activity。在此 Activity 中,您将确定(使用持久存储,即 SharedPreferences)应用程序应设置为哪个 Activity/back-stack 状态。

对于此示例,您可以在输入 GameActivity 时将带有密钥 isInGame 的 boolean 存储在 SharedPreferences 中。然后在导航活动中,您可以检索值并启动GameActivity 如果true。显然,为了处理游戏/应用程序状态,您将不得不存储更多,但这展示了简单的导航。

【讨论】:

  • 这更有意义,我无法弄清楚这种行为的逻辑。这也很有效,因为我计划在接下来的一两天内做一个闪屏。我会着手解决这个问题,看看我能得到什么。
  • 我几乎认为这条评论是正确的,但上面的评论找到了一个更简单的解决方案,感谢您的帮助。我想说这也是解决这个问题的好方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多