2017-01-03 4 views
1

Ich habe einen Dienst, wo ich Musik zu verwalten. Außerdem habe ich Aktivitäten, die Absichten mit der Musik des Benutzers senden. Wenn ich eine Aktivität öffne, möchte ich den aktuellen Spielstatus bekommen.Erhalten aktuellen Status von Android-Dienst

Ich habe bestimmte Spieler, die nur zwei Ereignisse haben: Spielbeginn und Spielende. Wenn ich also Broadcast benutze, bekomme ich nur das nächste Event. Ich speichere Ereignisse in Variable lastAction, wenn Sie es erhalten. Ich kann einen neuen Befehl ACTION_SEND_CURRENT_STATE erstellen. aber es sieht nicht gut aus.

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

Wie bekomme ich den aktuellen Status vom Dienst richtig? als Staat meine ich letzte Aktion.

+1

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

+0

@pskink mein Dienst arbeitet als Vordergrund – punksta

+0

es ist egal – pskink

Antwort

1

Verwenden Sie diese Methode

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; 
    } 

Hoffnung helfen Ihnen.

0

Als pskink erwähnt müssen Sie bind Ihren Dienst für Ihre Aktivität in der Lage sein, Informationen von Ihrem Dienst zu erhalten. Wenn Ihr Dienst in einem Remote-Prozess funktioniert, müssen Sie AIDL verwenden, um mit Ihrem Dienst zu kommunizieren, aber ich glaube, dass Sie in der Lage sind, das zu finden, wenn Sie dies selbst tun.

In Ihrem speziellen Fall die Service-Kommunikation könnte wie folgt aussehen (bitte beachten Sie, dass der Code nicht ganz korrekt sein kann, schrieb ich es richtig von meinem Kopf):

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

Keine Notwendigkeit, über den Dienst zu kümmern Verwenden Sie einfach den Vordergrund-Dienst, wie er von allen Musik-Anwendungen verwendet wird.

Verwandte Themen