Android 如何从onPause恢复活动状态(onSavedInstanceState无效)

Android 如何从onPause恢复活动状态(onSavedInstanceState无效),android,Android,基本上我的应用程序有两个活动。说“A”和“B”。A发射B 活动B播放音乐(在服务中)并具有通知 当视图在活动B上时,我按下后退按钮,然后我单击通知,活动B打开,活动状态完全丢失,音乐也停止(不需要)……我猜测这会发生,因为当我按下后退按钮时,活动被显式破坏,所以我必须程序化地恢复它的视图,对吗 首先想到的是使用onSavedInstanceState 但这不会有帮助,因为当用户按下后退按钮(我在文档中阅读了它)时,不会调用onSavedInstanceState,所以我的替代方法是什么呢?最简单

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

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

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

首先想到的是使用onSavedInstanceState
但这不会有帮助,因为当用户按下后退按钮(我在文档中阅读了它)时,不会调用onSavedInstanceState,所以我的替代方法是什么呢?

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

  • 使用自定义应用程序上下文
  • 您可以扩展
    android.app.Application
    ,并通过

    <application android:name="your.application.class" ...
    
    然后像这样使用它

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

    @Raghunandan我的问题尚未解决…hmmm OnSaveInstanceState最适合用于维护UI的标志非常小的数据,对于您的音乐内容,尝试从后台服务播放音乐,而不是UI@PulkitSethi这就是我正在做的,但为了简单起见,我没有在这里提到……@PulkitSethi顺便说一句,你不睡觉吗?快4点了……)@用户2993677祝您好运,解决您的问题。你说活动B播放音乐并有一个通知。那么服务在哪里使用呢。我不明白。谢谢你……我明天会用你的答案,如果有帮助,我会告诉你的,因为这里是晚上3点…我想我现在会阅读和研究它…我在想我是否应该在按下后退按钮时调用destroy方法??以便调用onDestroy,从而调用OnSavedInstances,这将减少我必须做的工作量…你认为这是一个好主意吗?看一看。在调用
    onDestroy()
    之前,应用程序可能会被终止,但此时上下文和单例将丢失。。。所以,我认为这可能会起作用。。。您可以使用
    onDestroy()
    \
    onCreate()
    组合。我没有理解您。。。。我是否能够使用savedinstances(我发现使用savedinstances非常简单,这就是我想使用它的原因…),但我认为这不会有帮助,因为如果我显式销毁活动,则不会调用ondestroy,因此也不会调用onsavedinstancestate,我不知道为什么在按下后退按钮后会有一种更简单的方法来恢复活动状态……是的,您可以使用它们,但系统不会为您存储包,因为您正在启动新的活动实例。您必须自己存储
    Bundle
    ,为此,我建议使用singleton。如果不使用保存的实例,你可以像@user2993972所说的那样将数据存储在首选项中……我不确定当我们按下后退按钮时,音乐播放器应用程序通常会这样做……我在想,是否应该在按下后退按钮时调用destroy方法??以便调用onDestroy,从而调用OnSavedInstances,这将减少我的工作量您认为这是个好主意吗?这对您没有帮助,因为当您返回活动时,onCreate()将使用null savedInstanceState调用。这是因为活动被破坏了…我不这么认为…如果是这样的话,那么savedinstances有什么用?也许你是对的…因为在这种情况下,我再次明确地称之为活动的破坏
    @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);
        ...
    }