我正在为 Android 创建一个音乐播放器,它大部分都在工作。问题是当我水平转动设备时,我会丢失 Activity 中的所有变量(这是有道理的,因为它被破坏并重新创建)。
我尝试使用捆绑包来存储带有 onSaveInstanceState 和 onRestoreInstanceState 的播放器状态,但我仍然无法访问媒体播放器。有没有办法在捆绑中传递像 MediaPlayer 这样的对象?我应该改用数据库吗?
谢谢
我正在为 Android 创建一个音乐播放器,它大部分都在工作。问题是当我水平转动设备时,我会丢失 Activity 中的所有变量(这是有道理的,因为它被破坏并重新创建)。
我尝试使用捆绑包来存储带有 onSaveInstanceState 和 onRestoreInstanceState 的播放器状态,但我仍然无法访问媒体播放器。有没有办法在捆绑中传递像 MediaPlayer 这样的对象?我应该改用数据库吗?
谢谢
您应该使用服务来提供“背景”音频播放功能,允许用户在活动之间切换或旋转设备而不停止播放。
查看android_packages_apps_Music由 CM 在 github 上开源,它使用 MediaPlaybackService 扩展服务来执行此操作,查看 MediaPlaybackService.java
对于无法通过包传递的对象,我建议您使用简单的 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 = 新数据(此);
您可以使用 set/get 和 mydata 来存储/检索您的持久数据。
编辑:它可能不适合 MediaPlayer 对象,但适用于其他经典类型(int、string、boolean ...)。
下面的两种方法都允许您通过旋转保持您的媒体播放器对象,但都不使用捆绑包。
您可以通过使用onRetainNonConfigurationInstance()
来保存您的媒体播放器并getLastNonConfigurationInstance()
在旋转后检索它,但这种方法不一定是最好的,因为它并不总是被调用
-有关更多信息,请参阅此 SO 帖子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的更多信息,请参阅此 SO 帖子
另一种方法是:
在您的 AndroidManifest.xml 中,找到您的活动条目并添加以下属性和值:
android:configChanges="orientation|screenSize"
这将阻止您的活动在定向时被破坏和重新创建。