我有一项服务,我在那里管理音乐播放。我也有活动发送用户音乐的意图。当我打开活动时,我希望获得当前的播放状态。
我有特定的玩家,只有两个事件:开始播放和播放结束。所以,如果我使用广播,我将只获得下一个活动。
获取时,我将事件保存在变量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)
)
}
如何正确地从服务中获取当前状态?作为国家,我的意思是最后一次行动。
答案 0 :(得分: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;
}
希望能帮到你。
答案 1 :(得分: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
}
}
}
答案 2 :(得分:0)
无需担心该服务仅使用所有音乐播放应用程序使用的前台服务。