Android: проверьте, работает ли сервис через. bindService - PullRequest
20 голосов
/ 14 декабря 2010

Как лучше всего проверить, работает ли служба Android? Мне известно о ActivityManager API, но похоже, что использование API не рекомендуется для сценариев, подобных моему ( source ). Мне также известно о возможности использования глобальных / постоянных переменных для поддержания состояния службы.

Я пытался использовать bindService с флагами, установленными на 0, но у меня возникли те же проблемы, что и у человека по ссылке source (единственное исключение было, я пытался bindService с местной службой).

Следующий звонок

getApplicationContext().bindService(new Intent(getApplicationContext(),
        MyService.class), mServiceConnection, 0);

всегда возвращает true, но не подключается. Это ожидаемое поведение? Мне кажется, bindService должен возвращать значение false, если служба еще не запущена (это не так, я проверял это) или если флаг BIND_AUTO_CREATE не установлен (опять же, это не так).

Ответы [ 7 ]

11 голосов
/ 28 января 2013

Использование общего предпочтения для сохранения флага запуска службы.

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    int res = super.onStartCommand(intent, flags, startId);
    setRunning(true);
    return res;
}

@Override
public void onDestroy() {
    super.onDestroy();
    setRunning(false);
}

private void setRunning(boolean running) {
    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
    SharedPreferences.Editor editor = pref.edit();

    editor.putBoolean(PREF_IS_RUNNING, running);
    editor.apply();
}

public static boolean isRunning(Context ctx) {
    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(ctx.getApplicationContext());
    return pref.getBoolean(PREF_IS_RUNNING, false);
}
11 голосов
/ 04 января 2011

У меня такая же проблема;Похоже, что наиболее известным решением является создание общедоступного статического логического значения в WhwhatService, для которого установлено значение true во время onCreate (или onStartCommand, по вашему выбору) и false во время onDestroy.Затем вы можете получить к нему доступ из любого другого класса в том же APK.Это может быть расисто, хотя.В Android нет API для проверки работоспособности службы (без побочных эффектов): см. http://groups.google.com/group/android-developers/browse_thread/thread/8c4bd731681b8331/bf3ae8ef79cad75d

Я полагаю, что состояние гонки связано с тем, что ОС может убить удаленную службу (в другом процессе).) в любое время.Проверка локальной службы (тот же процесс), как предложено выше, кажется мне свободной от гонки - если ОС убивает службу, она убивает также все, что проверял ее статус.

2 голосов
/ 15 февраля 2013

Другой метод:

public static boolean isServiceRunning(Context ctx, String serviceClassName) {
    ActivityManager manager = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
        if (TrackingService.class.getName().equals(serviceClassName)) {
            return true;
        }
    }
    return false;
}
1 голос
/ 14 декабря 2010

У меня была такая же потребность, и я обнаружил, что при запуске .bindService с чем-то уже связанным, это может вызвать ошибки. Я сделал это прямо перед запуском .bindService

try{
    context.unbindService(fetch_connection);
} catch (IllegalArgumentException e){
    System.out.println("Unbinding didn't work. little surprise");
}
0 голосов
/ 14 сентября 2016

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

  button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            Intent intent=new Intent(MainActivity.this, MyService.class);
            //startService(intent);
            bindService(intent,serviceConnection,BIND_AUTO_CREATE);
            if (myService!=null)
            {
                myService.RecData(editText.getText().toString());
            }
        }
    });
}

ServiceConnection serviceConnection=new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
        Toast.makeText(MainActivity.this,"onServiceConnected called",Toast.LENGTH_SHORT).show();
        MyService.MyBinder myBinder= (MyService.MyBinder) iBinder;
        myService= myBinder.getServiceInstant();
        myService.SetActivity(MainActivity.this);
        myService.RecData(editText.getText().toString());
    }
0 голосов
/ 12 февраля 2011
0 голосов
/ 14 декабря 2010

Что вы планируете делать, если служба работает / не работает?Почему бы просто не позвонить startService().Это создаст его, если он не запущен, и если это так, то вызовет свой метод onStart ().

...