从Android服务获取当前状态

时间:2017-01-03 10:16:27

标签: android service android-broadcastreceiver

我有一项服务,我在那里管理音乐播放。我也有活动发送用户音乐的意图。当我打开活动时,我希望获得当前的播放状态。

我有特定的玩家,只有两个事件:开始播放和播放结束。所以,如果我使用广播,我将只获得下一个活动。 获取时,我将事件保存在变量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)
    )
}

如何正确地从服务中获取当前状态?作为国家,我的意思是最后一次行动。

3 个答案:

答案 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)

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