基本上我的应用程序有2个活动。“A”和“B”。 A发布B。
活动B播放音乐(在服务中)并且还有通知。
当视图在活动B上时我按下后退按钮,然后我点击通知,活动B打开,活动状态完全丢失,音乐也停止(不需要)......我猜测它会发生,因为当我按下后退按钮时,活动被明确销毁,所以我必须以正确的方式恢复其视图吗?
但是这没有用,因为当用户按下按钮时我没有调用onSavedInstanceState(我在文档中读取它)所以我的替代方案是什么?
答案 0 :(得分:1)
最简单的方法是在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);
...
}
请注意,如果应用程序被杀死,则会破坏上下文和单例。如果您希望永久存储数据而不是使用应用程序文档文件夹或数据库(如果推荐),但我认为这不是您要查找的内容。
我希望这对你有帮助....
答案 1 :(得分:1)
正如您所写的onSavedInstanceState将无济于事,因为您的活动已被销毁并重新创建。如果您需要在应用程序生命周期中保存活动状态,则需要在外部存储数据,例如在数据库中。对于小数据,您可以使用共享首选项。