2017-01-03 132 views
1

我有一項服務,可以管理音樂播放。我也有活動發送用戶音樂意圖。當我打開活動時,我想獲得當前的播放狀態。從android服務獲取當前狀態

我有特定的播放器,只有兩個事件:播放開始和播放結束。所以如果我使用廣播,我只會得到下一個事件。 獲取它時,我將事件保存在變量lastAction中。我可以創建新的命令ACTION_SEND_CURRENT_STATE。但看起來不太好。

override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { 
    when (intent?.action) { 
     null -> { 
      player?.cancel() 
     } 
     ACTION_PLAY -> { 
      player?.cancel() 
      player = createPlayer(intent) 
      player?.start() 
     } 

     ACTION_STOP -> { 
      player?.cancel() 
     } 
    } 

    return START_STICKY 
} 

override fun onPlayingBegin(p0: player?) { 
    lastAction = BRODCAST_PLAYING_BEGIN 
    sendBroadcast(Intent(BRODCAST_PLAYING_BEGIN) 
      .putExtra(EXTRA_SONG, currentSong) 
    ) 
} 

如何從服務中正確獲取當前狀態?作爲我指的是最後一項行動。

+1

看到https://developer.android.com/guide/components/bound-services.html – pskink

+0

@pskink我的服務工作在前臺 – punksta

+0

它沒關係 – pskink

回答

1

使用此方法

public static boolean isServiceRunning(Context context, Class<?> serviceClass) { 
     ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
     for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { 
      if (serviceClass.getName().equals(service.service.getClassName())) { 
       return true; 
      } 
     } 
     return false; 
    } 

希望幫助你。

0

由於pskink提到您需要bind您的活動服務才能夠從您的服務中獲取信息。如果您的服務在遠程進程中運行,那麼您需要使用AIDL與您的服務進行通信,但我相信如果您這樣做,您就可以自己找到如何做到這一點。

在您的特定情況下,服務通信可能是這樣的(請注意,該代碼可能是不完全正確的,我寫的是正確的,從我的頭):

class LocalBinder(val service: MusicService) : Binder 

class MusicService : Service() { 
    var lastAction: String? = null 
     private set 
    private val binder: IBinder = LocalBinder(this) 

    override fun onBind(intent: Intent) = binder 

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { 
     lastAction = intent?.action 
     when (intent?.action) { 
      null -> { 
       player?.cancel() 
      } 
      ACTION_PLAY -> { 
       player?.cancel() 
       player = createPlayer(intent) 
       player?.start() 
      } 
      ACTION_STOP -> { 
       player?.cancel() 
      } 
     } 
     return START_STICKY 
    } 
} 

class MusicPlayerActivity : Activity() { 
    private var musicService: MusicService? = null 
    private val connection = object : ServiceConnection { 
     override fun onServiceConnected(className: ComponentName, service: IBinder) { 
      val binder = (LocalBinder) service 
      musicService = binder.service 
     } 

     override fun onServiceDisconnected(className: ComponentName) { 
      musicService = null 
     } 
    } 

    override fun protected onStart() { 
     super.onStart() 
     val intent = Intent(this, MusicService::class.java) 
     bindService(intent, connection, Context.BIND_AUTO_CREATE) 
    } 

    override fun protected onStop() { 
     super.onStop() 
     if (musicService != null) { 
      unbind(connection) 
      musicService = null 
     } 
    } 

    fun onClick() { 
     if (musicService != null) { 
      musicService.lastAction // do something 
     } 
    } 

} 
0

無需擔心服務只是使用所有音樂播放應用程序所使用的前臺服務。