设备旋转时丢失’MediaPlayer’(和其他变量)

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

我尝试使用bundle来存储onSaveInstanceState和onRestoreInstanceState的播放器状态,但我仍然无法访问媒体播放器。 有没有办法在捆绑中传递像MediaPlayer这样的对象? 我应该使用数据库吗?

谢谢

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

查看由github上的CM开源的android_packages_apps_Music ,它使用MediaPlaybackService extends Service来执行此操作,结帐MediaPlaybackService.java

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

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 = new Data(this);

您可以使用set / get和mydata来存储/检索持久数据。

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

下面的两种方法都允许您通过旋转保持媒体播放器对象,但都不使用包。

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

    – 请参阅此SOpost了解更多信息https://stackoverflow.com/a/3916068/655822

  • 或者您可以通过扩展应用程序类并将其存储在那里来保留您的媒体播放器

    以下信息从链接的SO答案复制,目的是使这个答案更快阅读

    如果将要使用很多,您可以在Global Singleton中传递数据。

     public class YourApplication extends Application { public SomeDataClass data = new SomeDataClass(); } 

    然后在以下任何活动中调用它:

     YourApplication appState = ((YourApplication)this.getApplication()); appState.data.UseAGetterOrSetterHere(); // Do whatever you need to with the data here. 

    – 有关该https://stackoverflow.com/a/4208947/655822的更多信息, 请参阅此SOpost

另一种方式是:

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

 android:configChanges="orientation|screenSize" 

这将阻止您的活动在方向上被销毁和重新创建。