Это способ проверить, действительно ли сервис работает так плохо? - PullRequest
0 голосов
/ 09 ноября 2019

В моем приложении, которое является медиаплеером, я хочу знать, работает ли моя служба или нет.

Причина, по которой я хочу это знать, заключается в том, что я хочу bind myсервис, когда он уже запущен.

Когда мое приложение открыто и нажата песня, я вызываю метод startMusicService , который проверяет, привязан ли сервис или нет, если нет, тогда я вызываюmethod bindMusicService .

in bindMusicService я проверяю, имеет ли mServiceIsBound значение true / false, если false, то тогда я Bind my Service который затем вызывает onServiceConnected .

in onServiceConnected я проверяю, является ли serviceAlreadyRunning ложным, если да, тогда я начинаю проигрывать мою песню.

Все работает отлично, но я уверен, что есть лучший и более эффективный способ достижения того же самого.

Я сделал это так, потому что, если я связываю свой сервис, скажем, в onCreate, это уженачинает играть песню безвыбор одного.

Я хочу, чтобы мой сервис запускался только при выборе песни для воспроизведения.

 public void bindMusicService(boolean alreadyRunning){
        //boolean alreadyRunning: if True, then we don't call startActionPlay() in onServiceConnected() because Service is already running.
        serviceAlreadyRunning = alreadyRunning;
        /*mediaPlayerServiceIntent binds our connection to the MediaPlayerService. */
        if (!mServiceIsBound) {
            try {
                mediaPlayerServiceIntent = new Intent(context, MediaPlayerService.class);
                context.bindService(mediaPlayerServiceIntent, serviceConnection, Context.BIND_AUTO_CREATE);
            } catch (Exception e) {
                Log.e("Main", "An exception was caught: Service is not bound!");
            }
        }
    }

    public void startMusicService(int songPos, ArrayList<Song> songs){
        songIndex = songPos;
        songList = songs;
        if (mServiceIsBound) {
            mediaPlayerService.startActionPlay(context, songList, songIndex);
        }else{
            bindMusicService(false);
            Log.i("Main", "startMusicService(): Service was not bound yet, binding Service...");
 }

Код в onServiceConnected

public void onServiceConnected(ComponentName name, IBinder service) {
            MediaPlayerService.MusicBinder binder = (MediaPlayerService.MusicBinder)service;
            mediaPlayerService = binder.getService();
            if (!serviceAlreadyRunning) {
                mediaPlayerService.startActionPlay(context, songList, songIndex);
            }
            mServiceIsBound = true;
            Intent intent = new Intent(Constants.ACTIONS.BROADCAST_SERVICE_BOUND);
            LocalBroadcastManager.getInstance(context).sendBroadcast(intent);

            Log.i("Main","MediaPlayerService is connected!");
   }

Почему код ниже считается плохим? Во многих публикациях говорится, что ActivityManager для проверки работающей службы должен использоваться только для целей отладки, а не для выпуска.

in onResume () У меня есть этот код:

if (isMyServiceRunning(MediaPlayerService.class)){
          if (!Main.getInstance().mServiceIsBound) {
                Main.getInstance().bindMusicService(true);
                Log.i(TAG, "Service already running but not bound!");
          }
          Log.i(TAG, "Service is running!");
}

isMyServiceRunning метод

private boolean isMyServiceRunning(Class<?> serviceClass){
        ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        if (activityManager != null){
            for (ActivityManager.RunningServiceInfo serviceInfo: activityManager.getRunningServices(Integer.MAX_VALUE)){
                if (serviceClass.getName().equals(serviceInfo.service.getClassName())){
                    return true;
                }
            }
        }
        return false;
}
...