Android AlarmManager для периодического чтения датчиков - PullRequest
1 голос
/ 29 ноября 2010

У меня есть задача периодически считывать датчики телефона (например, 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);
}

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

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 (по сравнению с "ресивером"?

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

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

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

0 голосов
/ 29 ноября 2010

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

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

...