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() при запуске службы.
и затем, когда ваша задача завершается или в случае какой-либо ошибки, вы снова можете вызвать широковещательный приемник для события обслуживания завершено.
Вот ссылка на хороший учебник.