我在Android工作室制作了一个litle游戏,我想在用户与应用程序交互时播放背景音乐(并在设置中打开它)。为此,我使用了一种服务来播放背景音乐。如下所示
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
public class BackgroundMusicService extends Service {
MediaPlayer player;
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
player = MediaPlayer.create(this, R.raw.backgroundmusic);
player.setLooping(true); // Set looping
}
public int onStartCommand(Intent intent, int flags, int startId) {
player.start();
return 1;
}
@Override
public void onDestroy() {
player.stop();
player.release();
}
@Override
public void onLowMemory() {
}
}
我希望我的背景音乐能够在我的所有活动中播放,但在用户离开应用程序时停止,因为无法在Android中检测到菜单按钮按下或主页按钮按下。我试着像这样解决它。
import java.util.Timer;
import java.util.TimerTask;
public class LeaveAppDetector extends BackgroundMusicService{
private boolean Deactivated;
private int Time = 700;
private int wait = 0;
private Timer timer = new Timer();
public void Activate() {
Deactivated = false;
timer.schedule(new TimerTask() {
@Override
public void run() {
if (wait >= 1) {
if (!getDeactivate()) {
//app has been closed
StopPlaying();
StopTimer();
} else {StopTimer();} //app has not been closed
}
wait++;
}
}, Time);
}
public void Deactivate() { //call at the start of each activity
Deactivated = true;
}
private boolean getDeactivate() {
return Deactivated;
}
private void StopTimer() {
if (timer != null) {
timer.cancel();
timer.purge();
}
}
}
这个想法是当一个活动开始时,它会调用Deactivate();当它关闭时,它调用Activate();以便在短时间后更新Activated的值。我将以下方法添加到我的BackgrondMusicService类中,以便能够远程关闭它
public void StopPlaying() {
player.stop();
player.release();
}
现在出现问题,它给了我一个错误,即我刚刚展示的方法中对媒体播放器的引用是指一个空对象,我不知道为什么或为什么它会赢得#t工作。有人可以帮忙吗?
答案 0 :(得分:0)
你需要使用像这个答案建议的绑定服务:
https://stackoverflow.com/a/2660696/3742122
如果您只希望在活动使用它时运行该服务,请考虑删除startService()。相反,在需要服务的活动的onStart()方法中使用bindService(),并在相应的onStop()方法中调用unbindService()。您可以使用BIND_AUTO_CREATE在需要时延迟启动服务,Android将在所有连接未绑定后自动停止服务。