-1

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

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

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

首先想到的是使用 onSavedInstanceState

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

4

2 回答 2

1

最简单的方法是将数据保存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);
    ...
}

请注意,如果应用程序被终止,上下文和单例将被破坏。如果您想永久存储数据而不是使用应用程序文档文件夹或数据库(如果推荐),但我认为这不是您想要的。

我希望这能帮到您....

于 2013-11-14T21:33:16.857 回答
1

正如您所写的 onSavedInstanceState 将无济于事,因为您的活动被破坏并重新创建。如果您需要在应用程序生命周期中保存活动状态,则需要将数据存储在外部 - 例如在数据库中。对于小数据,您可以使用共享偏好。

于 2013-11-14T21:40:50.110 回答