Java 失去';MediaPlayer';当设备旋转时(&;其他变量)
我正在为Android创建一个音乐播放器,它大部分都在工作。问题是,当我水平转动设备时,我丢失了活动中的所有变量(这是有意义的,因为它被销毁并重新创建) 我已尝试使用捆绑包存储具有onSaveInstanceState和onRestoreInstanceState的播放器的状态,但仍然无法访问媒体播放器。有没有办法将MediaPlayer之类的对象以捆绑方式传递?我应该改用数据库吗Java 失去';MediaPlayer';当设备旋转时(&;其他变量),java,android,android-layout,mobile,android-activity,Java,Android,Android Layout,Mobile,Android Activity,我正在为Android创建一个音乐播放器,它大部分都在工作。问题是,当我水平转动设备时,我丢失了活动中的所有变量(这是有意义的,因为它被销毁并重新创建) 我已尝试使用捆绑包存储具有onSaveInstanceState和onRestoreInstanceState的播放器的状态,但仍然无法访问媒体播放器。有没有办法将MediaPlayer之类的对象以捆绑方式传递?我应该改用数据库吗 感谢对于无法通过bundle传递的对象,我建议您使用简单的SharedReference来存储对象。 这里有一个简
感谢对于无法通过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()
在旋转后检索变量来持久化媒体播放器,但此方法不一定是最好的,因为它并不总是被调用 -有关更多信息,请参阅此SO帖子getLastNonConfigurationInstance()
- 也可以通过扩展应用程序类并将其存储在其中来持久化媒体播放器 下面的信息是从链接的SO答案中复制的,目的是使此答案更易于阅读 如果数据将被大量使用,您可以在全局单例中传递数据 然后通过以下方式在任何活动中调用它: -更多信息请参见本文
- 您可以通过使用
保存变量和onretainonconfigurationinstance()
在旋转后检索变量来持久化媒体播放器,但此方法不一定是最好的,因为它并不总是被调用 -有关更多信息,请参阅此SO帖子getLastNonConfigurationInstance()
- 也可以通过扩展应用程序类并将其存储在其中来持久化媒体播放器 下面的信息是从链接的SO答案中复制的,目的是使此答案更易于阅读 如果数据将被大量使用,您可以在全局单例中传递数据 然后通过以下方式在任何活动中调用它: -更多信息请参见本文
- 以下两种方法都允许您在旋转过程中保留mediaplayer对象,但都不使用捆绑包
检查一下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”添加到清单中