Android AlarmManager для периодического считывания показаний датчиков

У меня есть задача периодически считывать показания датчиков телефона (например, WiFi, акселерометра) в бэкенде.

Мое текущее решение - использовать AlarmManager.

В частности, у нас есть:

В «основной» программе (активности) мы используем PendingIntent.getService:

public class Main extends Activity {
...
Intent intent = new Intent(this, AutoLogging.class);
mAlarmSender = PendingIntent.getService(this, 0, intent, 0);
am = (AlarmManager)getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC, 0, 5*1000, mAlarmSender);
}

В программе «Авторегистрация» (сервис) мы периодически реагируем на тревогу:

public class AutoLogging extends Service {
...
@Override
public void onCreate() {
   Toast.makeText(this, "onCreate", Toast.LENGTH_SHORT).show();
}

@Override
public void onDestroy() {
   super.onDestroy();
   Toast.makeText(this, "onDestroy", Toast.LENGTH_SHORT).show();
}

@Override
public boolean onUnbind(Intent intent) {
   Toast.makeText(this, "onUnbind", Toast.LENGTH_SHORT).show()
   return super.onUnbind(intent);
}

@Override
public void onStart(Intent intent, int startId) {
   super.onStart(intent, startId);
   Toast.makeText(this, "onStart", Toast.LENGTH_SHORT).show();
   // Read sensor data here
}

@Override
   public IBinder onBind(Intent intent) {
   Toast.makeText(this, "onBind", Toast.LENGTH_SHORT).show();
   return null;
}
}

Моя проблема:

Когда я использую эту службу тревог, при каждой тревоге вызываются только OnCreate и OnStart.

Мои вопросы:

(1) Нужно ли нам вызывать OnDestroy (или onBind, onUnbind)?

(2) Это правильный способ использования AlarmManager (по сравнению с "широковещательным приемником")?

Спасибо! Винсент


person user523597    schedule 29.11.2010    source источник


Ответы (3)


AlarmManager просто использует ожидающее намерение и выполняет действие намерения, то есть запускает службу в вашем случае. По истечении срока действия тревоги создается служба с использованием onCreate (если она еще не запущена), а затем запускается вызовом onStart. После завершения чтения данных датчика вы можете остановить службу с помощью stopSelf (), который в конечном итоге вызовет onDestroy (). Вы не должны явно вызывать onDestroy (), onBind () или onUnBind () в службе.

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

person Suresh    schedule 29.11.2010
comment
Итак, должен ли я вызывать stopSelf в onStart после завершения чтения данных датчика? - person user523597; 29.11.2010
comment
И, кстати, в чем разница между моим текущим PendingIntent.getService и широковещательным приемником? Большое спасибо! - person user523597; 29.11.2010
comment
onReceive широковещательный приемник не должен выполнять операции, которые занимают много времени. Если чтение данных датчика занимает много времени, для выполнения этой операции следует использовать службу. Взгляните на stackoverflow.com/questions/3117350/ - person Suresh; 29.11.2010

Если вы хотите периодически планировать задание в Android, вместо использования диспетчера аварийных сигналов, вы можете использовать диспетчер сети GCM с периодической задачей. Это внутренне использует диспетчер сигналов тревоги или планировщик заданий в зависимости от версии Android. Его также проще использовать с более гибким вариантом. Отличная статья - https://www.bignerdranch.com/blog/optimize-battery-life-with-androids-gcm-network-manager/

person himanshu saluja    schedule 11.02.2019

Опоздание на годы для всех, кто наткнется на это.

Что касается того, какой метод вызывается, когда для служб, см. Этот пост здесь:

Android onCreate или onStartCommand для запуска службы

Вы хотите, чтобы он запускался в onStartCommand.

person MitchHS    schedule 12.08.2020
comment
Пожалуйста, не публикуйте в качестве ответа простые URL-адреса. В будущем они могут стать недействительными. - person mate00; 12.08.2020
comment
Правда, я просто хотел отдать должное первому человеку, ответившему на вопрос. - person MitchHS; 13.08.2020