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

时间:2013-11-14 20:31:08

标签: android

基本上我的应用程序有2个活动。“A”和“B”。 A发布B。

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

当视图在活动B上时我按下后退按钮,然后我点击通知,活动B打开,活动状态完全丢失,音乐也停止(不需要)......我猜测它会发生,因为当我按下后退按钮时,活动被明确销毁,所以我必须以正确的方式恢复其视图吗?

首先想到的是使用onSavedInstanceState

但是这没有用,因为当用户按下按钮时我没有调用onSavedInstanceState(我在文档中读取它)所以我的替代方案是什么?

2 个答案:

答案 0 :(得分:1)

最简单的方法是在onPause()中保存数据并将其恢复为onResume()。下一个问题是存储数据的位置。这样做的方法很少:

  1. 使用自定义应用程序上下文
  2. 您可以通过

    扩展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. 使用单例模式
    2. 您可以创建单例实例

      ,而不是定义上下文
      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将无济于事,因为您的活动已被销毁并重新创建。如果您需要在应用程序生命周期中保存活动状态,则需要在外部存储数据,例如在数据库中。对于小数据,您可以使用共享首选项。