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

时间:2018-10-21 20:13:12

标签: java android onbackpressed linphone

当使用后退或概述按钮将当前任务(我的应用程序)置于后台时,我需要一种方法来还原先前的Android任务。例如,当收到SIP呼叫时,YouTube应用会播放视频。软件电话任务进入前台,然后应答呼叫。通话结束后,按返回或概述按钮,将显示youtube app,视频将继续播放。此类Android应用程序的一个示例是Linphone。我想知道如何以编程方式实现这一目标。

3 个答案:

答案 0 :(得分:1)

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

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

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

何时可以观察到这种行为

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

    • 基本上,创建活动时不会杀死其他应用或将其放置在后台,关闭应用后,您将回到同一应用。

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

希望这会有所帮助。

答案 1 :(得分: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 1 Source 2

答案 2 :(得分:0)

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

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

如果用户将电话配置为始终在后台终止活动,或者他们的资源有限,则您必须处理该活​​动,但是在某些情况下(您的活动没有被终止并保留在内存中),如Mayank回答的那样,系统会执行此操作它给你。

从电话应用程序获得呼叫将中断您的应用程序(系统启动的UI状态被取消) 上面的文档建议的操作:

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

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

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

  •   

因此,在您的情况下,有一个视图模型可以存储收到来电后的网址和视频时间

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

这是一个很好的SO线程,并提供了有关如何使用savedInstanceState的示例: Saving Android Activity state using Save Instance State

它有新旧答案,您可能需要通读它,以了解事情随着时间的变化

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