用户按下主页按钮时停止Android服务

时间:2016-04-23 23:08:39

标签: android background android-service audio-player android-music-player

我有一个音乐服务,可以在应用程序的背景中播放音乐。我希望音乐能够继续播放应用程序的所有活动,但是当应用程序在后台运行时停止播放(即当用户转到另一个应用程序或按下主页按钮而不从正在运行的应用程序中删除应用程序时)

这是我的MusicService代码:

public class MusicService extends Service {
public static MediaPlayer player;

public IBinder onBind(Intent arg0) {
    return null;
}

public int onStartCommand(Intent intent, int flags, int startId) {


    player= MediaPlayer.create(this,R.raw.music1);
    player.start();
    player.setLooping(true);

    return super.onStartCommand(intent,flags,startId);

}

}

这是我与音乐服务相关的清单的一部分:

<service android:name=".MusicService" android:stopWithTask="true" />

编辑:如果有人知道如何在没有服务的情况下播放背景音乐也可以,只要音乐在整个时间播放应用程序打开并在按下主页按钮时关闭。

2 个答案:

答案 0 :(得分:0)

基本上你必须定义女巫活动是你的退出点,然后像这样编辑你的onStartCommand

private boolean playing; // use this var to determine if the service is playing
public int onStartCommand(Intent intent, int flags, int startId) {

  String action = intent.getAction();
  if(action == ACTION_PLAY) {
    // No each time your start an activity start the service with ACTION_PLAY but in ACTION_PLAY process check if the player if not already runing
      if(!playing) {
         player= MediaPlayer.create(this,R.raw.music1);
         player.start();
         player.setLooping(true);
         // here you set playing to true
         playing = true;
     }
 } else if(action.equals(ACTION_STOP) {
        // Set playing to false
        playing = false;
       // This is just an exemple : Now here increase a delay little bit so that the player will not stop automaticaly after leaving activity
        new Handler().postDelayed(new Runnable(){
               @override
               public void run() {
                // No before stoping the play service
                // check playing if playing dont go further 
                 if(playing) return;
                if(player!=null && player.isPlaying()) {
                    player.stop();
                    player.release();
                    player.reset(); // To avoid mediaPlayer has went away with unhandled error warning
                    player = null;
                    // And stop the service 
                    stopSelf();
                 }    
              }
      },2500);
 }
return START_STICKY;}

现在,如果你想开始玩

Intent intent = new Intent(context,YourService.class);
intent.setAction(YourService.ACTION_PLAY);

停止

Intent intent = new Intent(context,YourService.class);
intent.setAction(YourService.ACTION_STOP);

并且不要忘记定义两个动作内容字段

如果您不想定义退出点,可以定义一个布尔值,确定您的服务正在使用中,因此不会被延迟处理程序停止 现在,每当一个活动开始时,使用ACTION_PLAY操作启动服务 一旦它停止启动ACTION_STOP服务,将确保每个活动都能够启动和停止玩家 也不要忘记调整延迟
希望有所帮助

答案 1 :(得分:0)

我认为解决此问题的最佳方法是停止每个onPause()的{​​{1}}中的音乐,然后在每个Activity的{​​{1}}中开始播放音乐。您将遇到的问题是当您的应用程序从一个onResume()切换到另一个Activity时,您的音乐会断断续续。要解决这个问题,您应该将Activity(停止播放音乐)发布到Runnable中的Handler,但要将其发布,以便它不会立即运行。它应该延迟大约200毫秒。在onPause()中,取消onResume()以使其无法运行。这样可以防止卡顿,但在用户按下HOME按钮后200毫秒停止播放音乐。

另一种选择是不使用Runnable,而只是将Service实例保留在MediaPlayer类中。您仍然希望在ApplicationonPause()中停止并启动音乐,但只需调用onResume()课程中的某些方法即可直接完成。您需要创建一个Application的自定义Application类,并将其添加到您的清单中。