我正在为Android创建一个音乐播放器,它主要用于工作。问题是,当我水平转动设备时,我会丢失Activity中的所有变量(这是有意义的,因为它被销毁并重新创建)。
我尝试使用bundle来存储播放器的状态,使用onSaveInstanceState& onRestoreInstanceState但我仍然无法访问媒体播放器。有没有办法在捆绑中传递像MediaPlayer这样的对象?我应该使用数据库吗?
由于
答案 0 :(得分:4)
您应该使用服务提供“后台”音频播放功能,允许 用户在活动之间切换或旋转设备而不停止播放。
在github上查看由CM开源的android_packages_apps_Music,它使用MediaPlaybackService extends Service来执行此操作,结帐MediaPlaybackService.java
答案 1 :(得分:1)
对于无法通过包传递的对象,我建议您使用简单的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 =新数据(this);
您可以使用set / get和mydata来存储/检索持久数据。
编辑:它可能不适用于MediaPlayer对象,但适用于其他经典类型(int,string,boolean ...)。
答案 2 :(得分:1)
以下两种方法都允许您通过旋转保持媒体播放器对象,但都不能使用捆绑包。
您可以使用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.
答案 3 :(得分:0)
另一种方式是:
在AndroidManifest.xml中,找到您的活动条目,并添加以下属性和值:
android:configChanges="orientation|screenSize"
这将阻止您的活动在方向上被销毁和重新创建。