当我点击某个按钮时,它会将我的页面的layout
从布局A更改为布局B.我的问题是我想让MediaPlayer
保持活跃但更改layout
摧毁它。
如何防止这种情况发生?
我试过了
onSavedInstanceState(但此方法并不保存MediaPlayer状态或据我所知至少)
SharedPreferences(与上面相同的结果)
我的按钮代码很简单
view1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setContentView(R.layout.activity_1);
}
});
view2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setContentView(R.layout.activity_2);
}
});
修改
我正在播放直播,因此使用mp.seekTo(int)
是不可取的
编辑2
在测试了给我的所有答案之后,给布局充气确实让它保持活力,但这并不是我的预期。
问题是,我想将具有1 SurfaceView
的布局A更改为布局B,其中有2 SurfaceView
。对布局进行充气会使MediaPlayer
保持活动状态,但表面不能正确遵循布局
答案 0 :(得分:0)
2.您更改布局,使用LayoutInflator而不是“setContentView”,第二个布局应该是第一个布局的一部分更好。所以你的按钮用于改变布局,应该是第一次布局。
3.使用以下代码它应该可以工作。
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
LayoutInflater inflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.new_layout,relativeLayout);
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
LayoutInflater inflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.new_layout2,relativeLayout);
}
});
其中relativeLayout是First Layout的一部分,因此您只需使用此布局来扩充另一个布局。
@Override
protected void onStart() {
playIntent=new Intent(NewLayoutActivity.this,MusicService.class);
//playIntent.putExtra(MusicService.URL,"http://charan.com/tcs/audio/Chandana_Charchita.mp3");
playIntent.setAction(MusicService.MAIN_ACTION);
startService(playIntent);
bindService(playIntent,musicServiceConnection, Context.BIND_AUTO_CREATE);
Log.i(TAG,"onStart Called");
super.onStart();
}
public ServiceConnection musicServiceConnection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinderObject) {
myBinder= (MusicService.MyBinder) iBinderObject;
musicService=myBinder.getService();
mConnection=true;
musicService.initializeMediaPlayer("http://charan.com/tcs/audio/Chandana_Charchita.mp3");
Log.i(TAG,"Service Bounded...");
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
mConnection=false;
}
};
@Override
protected void onDestroy() {
if(mConnection){
unbindService(musicServiceConnection);
mConnection=false;
}
super.onDestroy();
}
服务代码......当您的服务受限时,请在服务中初始化媒体播放器。
public void initializeMediaPlayer(String url){
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.setOnPreparedListener(this);
player.setOnErrorListener(this);
player.setOnCompletionListener(this);
if(TextUtils.isEmpty(url)){
url=defaultUrl;
}
try {
player.setDataSource(url);
// player.prepareAsync();
player.prepare();
player.start();
player.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
} catch (IOException e) {
e.printStackTrace();
}
// mState="preparing";
mState="playing";
}
所以您的服务不会在这里打扰。即使你改变了布局。
答案 1 :(得分:0)
您可以使用Singleton类初始化任何对象一次,使用实例可以执行任何操作。
在你自己或应用程序被破坏之前它不会破坏。
我认为这肯定会解决你的目的。
快乐的编码!