为了账号安全,请及时绑定邮箱和手机立即绑定

将我的应用程序置于 Android 后台后如何恢复以前的应用程序

将我的应用程序置于 Android 后台后如何恢复以前的应用程序

慕森卡 2021-12-01 15:06:27
当当前任务(我的应用程序)使用后退或概览按钮置于后台时,我需要一种方法来恢复以前的 Android 任务。例如,当收到 SIP 呼叫时,youtube 应用程序播放视频。软件电话任务被置于前台,然后呼叫被应答。通话结束后,按返回或概览按钮会显示 youtube 应用程序并继续播放视频。此类 Android 应用程序的一个示例是 Linphone。我想知道如何以编程方式实现这一点。
查看完整描述

3 回答

?
红糖糍粑

TA贡献1815条经验 获得超6个赞

正如其他人和此处所述,Android 会自动为您处理。但是,如果你需要明确地添加任何东西去/来/从后台状态,那么你也可以重写时onSaveInstanceState()onRestoreInstanceState()将被相应地调用方法。

当您的 Activity 开始停止时,系统会调用该onSaveInstanceState()方法,以便您的 Activity 可以将状态信息保存到实例状态包中。此方法的默认实现保存有关 Activity 视图层次结构状态的瞬态信息,例如EditText小部件中的文本或小部件的滚动位置ListView

要为您的 Activity 保存其他实例状态信息,您必须覆盖onSaveInstanceState()并将键值对添加到在Bundle您的 Activity 意外销毁时保存的 对象。如果您覆盖onSaveInstanceState(),并且您希望默认实现保存视图层次结构的状态,则必须调用超类实现。

@Override

protected void onRestoreInstanceState(Bundle outState) {

    if (outState != null) {

       Crashlytics.log(1, "FormActivity", "Method:onRestoreInstanceState, Msg: saved instance is not null");


        if (outState.containsKey("record")

                && Session.getCurrentRecord() == null) {

            Session.setCurrentRecord(

                    gson.fromJson(

                            outState.getString("record"),

                            Record.class

                    )

            );

        }


        if (outState.containsKey("user")

                && Session.getCurrentUser() == null) {

            Session.setCurrentUser(

                    gson.fromJson(

                            outState.getString("user"),

                            User.class

                    )

            );

        }

    }

    super.onRestoreInstanceState(outState);

}


@Override

protected void onSaveInstanceState(Bundle outState) {

    Session.setCurrentRecord(record);

    outState.putString("record", gson.toJson(Session.getCurrentRecord()));

    outState.putString("user", gson.toJson(Session.getCurrentUser()));


    super.onSaveInstanceState(outState);

}


查看完整回答
反对 回复 2021-12-01
?
繁花如伊

TA贡献2012条经验 获得超12个赞

这是由android系统自动完成的。

现在为什么您可能无法注意到您的应用程序的这种行为。

  • 您可能正在从应用启动器启动您的应用。这意味着您已经将所有其他应用程序(启动器除外)置于后台。现在,根据启动器设置,当您按下后退按钮时,您可能会从启动应用程序的位置进入页面或主页。

你什么时候可以观察到这种行为

  1. 如果您的活动是从后台服务启动的,例如广播接收器

  2. 如果您的活动是通过单击通知按钮启动的

    • 基本上,当您的活动创建时没有杀死或将其他应用程序置于后台,当您的应用程序关闭时,您将返回到同一个应用程序。

例外 - 如果您使用主页按钮,所有应用程序都会转到后台并显示主屏幕。

希望这可以帮助。


查看完整回答
反对 回复 2021-12-01
?
动漫人物

TA贡献1815条经验 获得超10个赞

这是关于如何保留 UI 状态的官方文档:

https://developer.android.com/topic/libraries/architecture/saving-states

如果用户将手机配置为始终在后台终止活动或者他们的资源有限,那么您必须处理它,但在某些情况下(您的活动没有被终止并保留在内存中),因为 Mayank 回答系统会为您完成.

从电话应用程序接听电话将中断您的应用程序(系统启动的 UI 状态解除)您应该按照上述文档的建议执行的操作:

在部分:管理 UI 状态:分而治之

  • 本地持久性:存储您在打开和关闭活动时不想丢失的所有数据。示例:歌曲对象的集合,其中可能包括音频文件和元数据。

  • ViewModel:将显示关联的 UI 控制器所需的所有数据存储在内存中。示例:最近搜索和最近搜索查询的歌曲对象。

  • onSaveInstanceState():如果系统停止然后重新创建 UI 控制器,则存储轻松重新加载活动状态所需的少量数据。不是在此处存储复杂对象,而是将复杂对象持久保存在本地存储中,并将这些对象的唯一 ID 存储在 onSaveInstanceState() 中。示例:存储最近的搜索查询。

因此,在您的情况下,有一个视图模型可以存储收到呼叫时的 URL 和视频时间

我还会使用正确的生命周期钩子在 instanceState 中存储相同的信息

这是一个很好的 SO 线程,其中包含有关如何使用 savedInstanceState 的示例: Saving Android Activity state using Save Instance State

它有新旧答案,您可能需要通读一遍以了解事情如何随着时间的推移而发生变化

基本上上面三个要点是官方文档推荐的策略


查看完整回答
反对 回复 2021-12-01
  • 3 回答
  • 0 关注
  • 331 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信