【发布时间】:2015-03-20 08:25:24
【问题描述】:
这是我的代码,我尝试构建一个简单的应用程序,当我单击一个按钮时播放一首歌曲(单击两次将从头开始播放新歌曲)并在按下另一个按钮时停止播放。 我希望当用户将活动置于后台时,媒体播放器将“保存其状态” - 继续播放/不播放 - 当活动返回前台时,交互将保持不变。 相反,它工作正常,直到我将活动放在后台(然后它继续播放/不播放)但是当我返回它时,它似乎“创建了一个新的媒体播放器对象”,如果我在播放歌曲时单击播放,它从头开始同时播放前一首歌曲,然后单击停止 - 仅停止歌曲的新“实例”。就像我在后台活动后与媒体播放器失去联系一样。 可能是什么问题?
public class MainActivity extends ActionBarActivity {
private MediaPlayer mediaPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button buttonStart = new Button(this);
Button buttonStop = new Button(this);
buttonStart.setText(R.string.button_start_text);
buttonStop.setText(R.string.button_stop_text);
buttonStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startPlaying();
}
});
buttonStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stopPlaying();
}
});
ViewGroup layout = (ViewGroup) findViewById(R.id.mainLayout);
layout.addView(buttonStart);
layout.addView(buttonStop);
}
void startPlaying(){
stopPlaying();
mediaPlayer = MediaPlayer.create(this,R.raw.dreams);
mediaPlayer.start();
}
void stopPlaying(){
if (mediaPlayer != null){
try {
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
mediaPlayer.reset();
mediaPlayer.release();
}
}
catch (Exception e){
e.printStackTrace();
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
我也更改了代码,像这样(现在有 3 个按钮:播放、停止、暂停:
void startPlaying(){
if (mediaPlayer == null) {
mediaPlayer = MediaPlayer.create(this, R.raw.dreams);
}
mediaPlayer.start();
}
void stopPlaying(){
if (mediaPlayer != null){
try {
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
mediaPlayer.prepare();
}
}
catch (Exception e){
e.printStackTrace();
}
}
}
void pausePlaying(){
if (mediaPlayer != null) mediaPlayer.pause();
}
但仍然是相同的行为。
我得到的一些见解:
在用户将活动置于后台之前,成员 mediaPlayer 是一些构造的 android 对象。
当活动返回到前台时,mediaPlayer 为空。
为什么是这样?
也许我对活动的想法有误,但我认为它在其生命周期中保持其成员的价值观。
【问题讨论】:
-
在我看来,您正在 startPlaying() 方法中创建一个新的媒体播放器实例。
-
那么在创建新的之前如何销毁它?
标签: java android android-mediaplayer