Java 如何在我的应用程序放在安卓系统的后台后恢复以前的应用程序

Java 如何在我的应用程序放在安卓系统的后台后恢复以前的应用程序,java,android,onbackpressed,linphone,Java,Android,Onbackpressed,Linphone,我需要一种方法来恢复以前的Android任务时,我的应用程序的当前任务是在后台使用返回或概述按钮。例如,youtube应用程序在收到SIP呼叫时播放视频。软电话任务被带到前台,然后呼叫被应答。通话结束后,按后退或概览按钮,youtube应用程序将显示,视频将继续播放。Linphone就是这种Android应用程序的一个例子。我想知道如何通过编程实现这一点。这是由android系统自动完成的 现在,您可能无法注意到应用程序的这种行为 您可能正在从应用程序启动器启动应用程序。这意味着您已经将除启动器

我需要一种方法来恢复以前的Android任务时,我的应用程序的当前任务是在后台使用返回或概述按钮。例如,youtube应用程序在收到SIP呼叫时播放视频。软电话任务被带到前台,然后呼叫被应答。通话结束后,按后退或概览按钮,youtube应用程序将显示,视频将继续播放。Linphone就是这种Android应用程序的一个例子。我想知道如何通过编程实现这一点。

这是由android系统自动完成的

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

您可能正在从应用程序启动器启动应用程序。这意味着您已经将除启动器之外的所有其他应用程序置于后台。现在,根据启动器设置,当您按下“上一步”按钮时,您可以进入启动应用程序的页面或主页。 你什么时候能观察到这种行为

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

基本上,当你的活动创建时没有关闭或在后台放置其他应用程序,当你的应用程序关闭时,你将返回到同一个应用程序。 例外情况-如果您使用“主页”按钮,则所有应用程序都会转到后台并显示主页屏幕


希望这能有所帮助。

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

如果用户将手机配置为总是在后台终止活动,或者他们的资源有限,则您必须处理该问题,但在某些情况下,您的活动没有终止,并保留在内存中,因为Mayank回答说,系统将为您执行此操作

从手机应用接到电话将中断应用系统启动的UI状态 根据上述文档的建议,您应该做什么:

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

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

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

因此,在您的案例中,有一个视图模型,用于存储接收到呼叫时的Url和视频时间

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

下面是一个很好的SO线程,并举例说明如何使用savedInstanceState:

它有旧的和新的答案,你可能想通读它,以了解事情是如何随着时间的推移而变化的

基本上,上面的三个要点是官方文档推荐的策略,正如其他人所说,Android会自动为您处理。但是,如果在进入/进入/离开后台状态时需要显式添加任何内容,则还可以重写将相应调用的onSaveInstanceState和onRestoreInstanceState方法

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

若要为“活动”保存其他实例状态信息,必须覆盖onSaveInstanceState并将键值对添加到 在您的活动被激活时保存的Bundle对象 意外地被摧毁。如果覆盖onSaveInstanceState,则 如果需要默认值,则必须调用超类实现 实现以保存视图层次结构的状态


澄清一下:我的应用程序是软电话,因此我对如何在初始评论中触发另一个应用程序还原状态youtube应用程序感兴趣。
@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);
}