如何在活动之外停止服务?

时间:2016-02-13 09:18:58

标签: java android background-process

我在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工作。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

你需要使用像这个答案建议的绑定服务:

https://stackoverflow.com/a/2660696/3742122

  

如果您只希望在活动使用它时运行该服务,请考虑删除startService()。相反,在需要服务的活动的onStart()方法中使用bindService(),并在相应的onStop()方法中调用unbindService()。您可以使用BIND_AUTO_CREATE在需要时延迟启动服务,Android将在所有连接未绑定后自动停止服务。