2017-01-03 137 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

无需担心服务只是使用所有音乐播放应用程序所使用的前台服务。