如何从暂停恢复活动状态(onSavedInstanceState 将无济于事)



基本上我的应用程序有 2 个活动。说"A"和"B"。A 启动 B。

活动 B 播放音乐(在服务中),并且还具有通知。

当视图在活动B上时,我按下返回按钮,然后单击通知,活动B打开,活动状态完全丢失,音乐也停止(不需要)......我猜测它之所以发生,是因为当我按下后退按钮时,活动被显式破坏,所以我必须按程序恢复它的视图,对吗?

首先想到的是使用 onSavedInstanceState

但这无济于事,因为当用户按下后退按钮时不会调用 onSavedInstanceState(我在文档中阅读了它),所以我有什么替代方案??

最简单的方法是将数据保存在onPause()中,然后在onResume()中恢复。下一个问题是在哪里存储数据。有几种方法可以做到这一点:

  1. 使用自定义应用程序上下文

您可以通过以下方式扩展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);
    ...
}
  1. 使用单例模式

您可以创建单一实例,而不是定义上下文

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不会有帮助,因为你的活动被销毁并重新创建。如果需要在应用生命周期中保存活动状态,则需要将数据存储在外部,例如在数据库中。对于小型数据,您可以使用共享首选项。

最新更新