【问题标题】:How to restore previous application after my application is put in background on Android将我的应用程序置于 Android 后台后如何恢复以前的应用程序
【发布时间】:2018-10-21 20:13:11
【问题描述】:

当当前任务(我的应用程序)使用后退或概览按钮置于后台时,我需要一种方法来恢复以前的 Android 任务。例如,当收到 SIP 呼叫时,youtube 应用会播放视频。软件电话任务被带到前台,然后接听电话。通话结束后,按返回或概览按钮会显示 youtube 应用程序并继续播放视频。此类 Android 应用程序的一个示例是 Linphone。我想知道如何以编程方式实现这一点。

【问题讨论】:

    标签: java android onbackpressed linphone


    【解决方案1】:

    正如其他人和here 所说,Android 会自动为您处理。但是,如果您需要在进入/进入/离开后台状态时显式添加任何内容,那么您也可以覆盖 onSaveInstanceState()onRestoreInstanceState() 方法,它们将被相应地调用。

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

    要为您的活动保存额外的实例状态信息,您必须覆盖 onSaveInstanceState() 并将键值对添加到 Bundle 在您的活动发生时保存的对象 意外毁坏。如果你覆盖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);
    }
    

    Source 1Source 2

    【讨论】:

      【解决方案2】:

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

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

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

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

      1. 如果您的活动是从后台服务启动的,例如广播接收器
      2. 如果您的活动是通过单击通知按钮启动的

        • 基本上,如果您的 Activity 是在没有杀死其他应用或将其他应用置于后台的情况下创建的,那么当您的应用关闭时,您将返回到同一个应用。

      例外 - 如果您使用主页按钮,所有应用程序都会进入后台并出现主屏幕。

      希望这会有所帮助。

      【讨论】:

      • 澄清一下:我的应用程序是软电话,所以我对如何触发其他应用程序恢复状态感兴趣(初始评论中的 youtube 应用程序)。
      【解决方案3】:

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

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

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

      从手机应用程序接听电话会中断您的应用程序(系统启动的 UI 状态解除) 您应该按照上述文档的建议做什么:

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

      • 本地持久性:存储您在打开和关闭活动时不想丢失的所有数据。示例:歌曲集 对象,其中可能包括音频文件和元数据。
      • ViewModel:将显示相关 UI 控制器所需的所有数据存储在内存中。例子:最喜欢的歌曲对象 最近的搜索和最近的搜索查询。

      • onSaveInstanceState():存储少量数据,以便在系统停止然后重新创建时轻松重新加载活动状态 用户界面控制器。与其在这里存储复杂的对象,不如持久化 本地存储中的复杂对象并为 onSaveInstanceState() 中的这些对象。示例:存储最多 最近的搜索查询。

      所以在您的情况下,有一个视图模型,用于存储接收到呼叫时的 Url 和视频时间

      我还会使用适当的生命周期挂钩将相同的信息存储在 instanceState 中

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多