当使用后退或概述按钮将当前任务(我的应用程序)置于后台时,我需要一种方法来还原先前的Android任务。例如,当收到SIP呼叫时,YouTube应用会播放视频。软件电话任务进入前台,然后应答呼叫。通话结束后,按返回或概述按钮,将显示youtube app,视频将继续播放。此类Android应用程序的一个示例是Linphone。我想知道如何以编程方式实现这一目标。
答案 0 :(得分:1)
这是由android系统自动完成的。
现在,为什么您可能无法注意到应用程序的这种行为。
何时可以观察到这种行为
如果通过单击通知按钮启动您的活动
例外-如果您使用主屏幕按钮,则所有应用程序都会进入后台,并显示主屏幕。
希望这会有所帮助。
答案 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);
}
答案 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
它有新旧答案,您可能需要通读它,以了解事情随着时间的变化
基本上,以上三个要点是官方文档中推荐的策略