Java 失去';MediaPlayer';当设备旋转时(&;其他变量)

Java 失去';MediaPlayer';当设备旋转时(&;其他变量),java,android,android-layout,mobile,android-activity,Java,Android,Android Layout,Mobile,Android Activity,我正在为Android创建一个音乐播放器,它大部分都在工作。问题是,当我水平转动设备时,我丢失了活动中的所有变量(这是有意义的,因为它被销毁并重新创建) 我已尝试使用捆绑包存储具有onSaveInstanceState和onRestoreInstanceState的播放器的状态,但仍然无法访问媒体播放器。有没有办法将MediaPlayer之类的对象以捆绑方式传递?我应该改用数据库吗 感谢对于无法通过bundle传递的对象,我建议您使用简单的SharedReference来存储对象。 这里有一个简

我正在为Android创建一个音乐播放器,它大部分都在工作。问题是,当我水平转动设备时,我丢失了活动中的所有变量(这是有意义的,因为它被销毁并重新创建)

我已尝试使用捆绑包存储具有onSaveInstanceState和onRestoreInstanceState的播放器的状态,但仍然无法访问媒体播放器。有没有办法将MediaPlayer之类的对象以捆绑方式传递?我应该改用数据库吗


感谢对于无法通过bundle传递的对象,我建议您使用简单的SharedReference来存储对象。 这里有一个简单的实现:

public class Data {
     private SharedPreferences preferences; 
     private int test; 

     public Data (Context context)
     {          
        preferences = context.getSharedPreferences("Data", 0);
        test = preferences.getInt("test", 0);
     }

     public int getTest()
     {       
             return test;
     }

     public void setTest(int input)
     {       
        this.test = input;
        SharedPreferences.Editor editor = preferences.edit();
        editor.putInt("Test", input);
        editor.commit();
     }    
}
您只需在onCreate()中初始化变量:

数据mydata=新数据(此)

您可以将set/get与mydata一起使用来存储/检索持久数据


编辑:它可能不适用于MediaPlayer对象,但适用于其他经典类型(int、string、boolean…。

对于无法通过捆绑传递的对象,我建议您使用简单的SharedReference来存储对象。 这里有一个简单的实现:

public class Data {
     private SharedPreferences preferences; 
     private int test; 

     public Data (Context context)
     {          
        preferences = context.getSharedPreferences("Data", 0);
        test = preferences.getInt("test", 0);
     }

     public int getTest()
     {       
             return test;
     }

     public void setTest(int input)
     {       
        this.test = input;
        SharedPreferences.Editor editor = preferences.edit();
        editor.putInt("Test", input);
        editor.commit();
     }    
}
您只需在onCreate()中初始化变量:

数据mydata=新数据(此)

您可以将set/get与mydata一起使用来存储/检索持久数据


编辑:它可能不适用于MediaPlayer对象,但适用于其他经典类型(int、string、boolean…。

以下两种方法都允许您在旋转过程中保留MediaPlayer对象,但都不使用bundle

  • 您可以通过使用
    onretainonconfigurationinstance()
    保存变量和
    getLastNonConfigurationInstance()
    在旋转后检索变量来持久化媒体播放器,但此方法不一定是最好的,因为它并不总是被调用

    -有关更多信息,请参阅此SO帖子

  • 也可以通过扩展应用程序类并将其存储在其中来持久化媒体播放器

    下面的信息是从链接的SO答案中复制的,目的是使此答案更易于阅读

    如果数据将被大量使用,您可以在全局单例中传递数据

    然后通过以下方式在任何活动中调用它:

    -更多信息请参见本文


    • 以下两种方法都允许您在旋转过程中保留mediaplayer对象,但都不使用捆绑包

      • 您可以通过使用
        onretainonconfigurationinstance()
        保存变量和
        getLastNonConfigurationInstance()
        在旋转后检索变量来持久化媒体播放器,但此方法不一定是最好的,因为它并不总是被调用

        -有关更多信息,请参阅此SO帖子

      • 也可以通过扩展应用程序类并将其存储在其中来持久化媒体播放器

        下面的信息是从链接的SO答案中复制的,目的是使此答案更易于阅读

        如果数据将被大量使用,您可以在全局单例中传递数据

        然后通过以下方式在任何活动中调用它:

        -更多信息请参见本文


      您应该使用提供“后台”音频播放功能的服务,允许 用户可以在活动之间切换或在不停止播放的情况下旋转设备


      检查一下github上的CM是开源的,它使用MediaPlaybackService扩展服务来实现这一点,检查MediaPlaybackService.java

      您应该使用一个服务来提供“后台”音频播放功能,允许 用户可以在活动之间切换或在不停止播放的情况下旋转设备


      查看github上CM的开源版本,它使用MediaPlaybackService扩展服务来完成此操作,查看MediaPlaybackService.java另一种方法是:

      在AndroidManifest.xml中,找到活动的条目并添加以下属性和值:

      android:configChanges="orientation|screenSize"
      

      这将阻止您的活动在定向时被破坏和重新创建。

      另一种方法是:

      在AndroidManifest.xml中,找到活动的条目并添加以下属性和值:

      android:configChanges="orientation|screenSize"
      

      这将阻止您的活动在定向时被破坏和重新创建。

      这将起作用,但如果您对横向和纵向使用不同的布局,则需要处理替换布局的问题。Ye,这只是为了避免问题-这就是我所使用的:)这将起作用,但如果你使用不同的布局进行横向和纵向,你需要处理替换布局的问题。是的,这只是为了避免问题-这就是我所使用的:)任何人尝试这一点,请确保添加:android:name=“.ClassName”,确保将:android:name=“.ClassName”添加到清单中