Android: как определить, работает ли IntentService?

У меня есть активность для загрузки, из которой я звоню в службу Intent. Там я обрабатываю вызов запроса API.

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

Я попробовал следующее, чтобы определить, работает ли служба:

public void startUploadServiceTask() {
    if (Util.isNetworkAvailable(mContext)) {

        if (!isMyServiceRunning(UploadDriveService.class)) {

                startService(new Intent(mContext,
                        UploadService.class));

            }
        } else {
            Toast.makeText(mContext,
                    "Service is already running.", Toast.LENGTH_SHORT)
                    .show();
        }
    } else {
        Toast.makeText(mContext,
                getString(R.string.please_check_internet_connection),
                Toast.LENGTH_SHORT).show();
    }
}



private boolean isMyServiceRunning(Class<?> serviceClass) {
    ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    for (RunningServiceInfo service : manager
            .getRunningServices(Integer.MAX_VALUE)) {
        Log.e("ALL SERVICE", service.service.getClassName().toString());
        if (serviceClass.getName().equals(service.service.getClassName())) {

            return true;
        }
    }
    return false;
}

Но в Activity Manager Running Service Info я не получаю класс службы намерений, который я использую, так что это всегда ложно.

Я использовал Broadcast для ответа на вызовы API.

Я даже проверил этот код.

if(startService(someIntent) != null) { 
 Toast.makeText(getBaseContext(), "Service is already running",     Toast.LENGTH_SHORT).show();
} else {
 Toast.makeText(getBaseContext(), "There is no service running, starting     service..", Toast.LENGTH_SHORT).show();
} 

Но в этом коде при проверке службы он также запускает службу снова, поэтому служба вызывается дважды.

Пожалуйста, помогите мне с этим.

2 ответа

IntentService необходимо реализовать onHandleIntent() Этот метод вызывается в рабочем потоке с запросом на обработку запроса Intent, и IntentService будет "живым" до тех пор, пока он обрабатывает намеренный запрос (здесь я не рассматриваю случаи нехватки памяти и другие основные моменты, а просто думаю с точки зрения логики),

И когда все запросы были обработаны, IntentService останавливается сам (и, следовательно, вы не должны явно вызывать stopSelf())

Имея эту теорию, вы можете попробовать следующую логику:
Объявите переменную класса внутри вашего класса IntentService.
public static boolean isIntentServiceRunning = false;

@Override    
     protected void onHandleIntent(Intent workIntent) { 
        if(!isIntentServiceRunning) {
         isIntentServiceRunning = true;
       }
      //Your other code here for processing request
 }

И в onDestroy() класса IntentService, если вы можете выбрать, установите isIntentServiceRunning = false;

И использовать isIntentServiceRunning проверить, работает ли IntentService!

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

Есть несколько возможностей для общения с сервисом и наоборот. Так как вы используете приемник Broadcast, вы можете транслировать сообщение в методе onHandleIntent() при запуске службы.

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

Вот ссылка на хороший учебник.

Другие вопросы по тегам