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);
}
TA贡献2012条经验 获得超12个赞
这是由android系统自动完成的。
现在为什么您可能无法注意到您的应用程序的这种行为。
您可能正在从应用启动器启动您的应用。这意味着您已经将所有其他应用程序(启动器除外)置于后台。现在,根据启动器设置,当您按下后退按钮时,您可能会从启动应用程序的位置进入页面或主页。
你什么时候可以观察到这种行为
如果您的活动是从后台服务启动的,例如广播接收器
如果您的活动是通过单击通知按钮启动的
基本上,当您的活动创建时没有杀死或将其他应用程序置于后台,当您的应用程序关闭时,您将返回到同一个应用程序。
例外 - 如果您使用主页按钮,所有应用程序都会转到后台并显示主屏幕。
希望这可以帮助。
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
它有新旧答案,您可能需要通读一遍以了解事情如何随着时间的推移而发生变化
基本上上面三个要点是官方文档推荐的策略
添加回答
举报