基本上我的应用程序有 2 个活动。说"A"和"B"。A 启动 B。
活动 B 播放音乐(在服务中),并且还具有通知。
当视图在活动B上时,我按下返回按钮,然后单击通知,活动B打开,活动状态完全丢失,音乐也停止(不需要)......我猜测它之所以发生,是因为当我按下后退按钮时,活动被显式破坏,所以我必须按程序恢复它的视图,对吗?
首先想到的是使用 onSavedInstanceState
但这无济于事,因为当用户按下后退按钮时不会调用 onSavedInstanceState(我在文档中阅读了它),所以我有什么替代方案??
最简单的方法是将数据保存在onPause()
中,然后在onResume()
中恢复。下一个问题是在哪里存储数据。有几种方法可以做到这一点:
- 使用自定义应用程序上下文
您可以通过以下方式扩展android.app.Application
并在清单文件中注册您的类
<application android:name="your.application.class" ...
这将允许您通过调用'Context.getApplicationContext()来获取类的单例实例。
例如,您可以创建
public class MyContext extends Application {
Bundle mySavedData = null;
public void setSavedData(Bundle data){
mySavedData = data;
}
public Bundle getSavedData() {
return mySavedData;
}
}
然后像这样使用它
@overide
public void onResume(){
...
Bundle state = ((MyContext) getApplicationContext()).getSavedData();
if(state != null) {
/* restore states */
}
...
}
@overide
public void onPause(){
...
Bundle state = new Bundle();
...
/* save your data here and save it into the context or set null otherwise*/
((MyContext) getApplicationContext()).setSavedData(state);
...
}
- 使用单例模式
您可以创建单一实例,而不是定义上下文
public class MySingleton {
static MySingleton instance;
public static MySingleton getInstance() {
if(instance == null){
instance = new MySingleton();
}
return instance;
}
public Bundle mySavedData = null;
void setSavedData(Bundle data){
mySavedData = data;
}
public Bundle getSavedData() {
return mySavedData;
}
}
你可以使用它
@overide
public void onResume(){
...
Bundle state = MySingleton.getInstance().getSavedData();
if(state != null) {
/* restore states */
}
...
}
@overide
public void onPause(){
...
Bundle state = new Bundle();
...
/* save your data here and save it into the context or set null otherwise*/
MySingleton.getInstance().setSavedData(state);
...
}
请注意,如果应用程序被终止,上下文和单例将被销毁。如果您想永久存储数据,而不是使用应用程序文档文件夹或数据库,如果建议,但我认为这不是您想要的。
我希望这会对你有所帮助。
正如你所写的SavedInstanceState不会有帮助,因为你的活动被销毁并重新创建。如果需要在应用生命周期中保存活动状态,则需要将数据存储在外部,例如在数据库中。对于小型数据,您可以使用共享首选项。