2016-02-13 44 views
0

我正在android工作室製作一個小型遊戲,當用戶與應用程序進行交互(並在設置中打開它)時,我想要播放背景音樂。爲此,我使用了一個用於播放backgroundmusic的服務。正如你可以看到下面如何在活動之外停止服務?

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() { 
    } 
} 

我希望我的backgroundmusic對我所有的活動中發揮,但是當用戶離開應用程序,停止,因爲它是不可能檢測菜單按鈕按下或home鍵按下的機器人。我試圖解決這個問題。

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();以便激活的值在短時間內更新。我添加下面的方法來我BackgrondMusicService類,以便能夠將其關閉遠程

public void StopPlaying() { 
    player.stop(); 
    player.release(); 
} 

現在的問題,它給我的錯誤的參考方法我只是表明mediaplayers,是一個指的是一個空對象,我不知道爲什麼或爲什麼它不起作用。有人可以幫忙嗎?

+0

嘗試從'Activity'的'onDestroy'或'onPause'方法停止服務,並在'onCreate'或'onResume'中啓動它。 –

+0

您可以將您的服務註冊到'BroadcastReceiver'並註冊您每次輸入設置時發送的自定義意圖,或者用戶與UI進行交互。這是我用來發送操作到服務的內容。 –

回答

0

您需要使用這樣的回答一個綁定的服務建議:

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

如果你只是想在服務上運行,而活動都使用它,可以考慮擺脫startService的()。相反,在需要該服務的活動的onStart()方法中使用bindService(),並在其相應的onStop()方法中調用unbindService()。您可以使用BIND_AUTO_CREATE在需要時延遲啓動服務,並且在所有連接解除綁定後,Android將自動停止服務。