【问题标题】:Losing 'MediaPlayer' (& other Variables) when Device is Rotated设备旋转时丢失“MediaPlayer”(和其他变量)
【发布时间】:2012-04-06 16:35:31
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: java android android-layout mobile android-activity


    【解决方案1】:

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

    查看android_packages_apps_Music,这是 CM 在 github 上的开源,它使用 MediaPlaybackService 扩展服务来执行此操作,查看 MediaPlaybackService.java

    【讨论】:

      【解决方案2】:

      对于无法通过捆绑传递的对象,我建议您使用简单的 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...)。

      【讨论】:

        【解决方案3】:

        以下两种方法都可以让您的媒体播放器对象保持旋转,但都不使用捆绑包。

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

          -有关更多信息,请参阅此 SO 帖子https://stackoverflow.com/a/3916068/655822

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

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

          如果要经常使用,您可以在全局单例中传递数据。

          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的更多信息,请参阅此 SO 帖子

        【讨论】:

        • 任何尝试此操作的人,请务必在清单中添加:android:name=".ClassName"
        【解决方案4】:

        另一种方法是:

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

        android:configChanges="orientation|screenSize"
        

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

        【讨论】:

        • 这可行,但如果您对横向和纵向使用不同的布局,则需要处理替换布局。
        • 是的,它只是在避免这个问题 - 这是我正在使用的 :)
        猜你喜欢
        • 1970-01-01
        • 2011-03-03
        • 2013-12-21
        • 1970-01-01
        • 2020-08-02
        • 2022-12-22
        • 2014-01-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多