Я использую этот код для активации периодических сигналов тревоги через широковещательный приемник:
public class UpdateReceiver extends BroadcastReceiver {
public static final String LOG_TAG = "camerawatch.alarmactivator";
public static final String ACTION = "de.pribluda.android.camerawatch.UPDATE_ALARM";
public static void activate(Context context) {
AlarmManager alarmService = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(ACTION);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_NO_CREATE);
Log.d(LOG_TAG, "pending intent: " + pendingIntent);
// if no intent there, schedule it ASAP
if (pendingIntent == null) {
pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
// schedule new alarm in 15 minutes
alarmService.setInexactRepeating(AlarmManager.RTC, System.currentTimeMillis(),300000, pendingIntent);
Log.d(LOG_TAG, "scheduled intent: " + pendingIntent);
}
}
@Override
public void onReceive(Context context, Intent intent) {
Log.d(LOG_TAG, "received intent: " + intent);
CameraWidgetProvider.displayCurrentState(context);
}
}
Обратите внимание, что активация выполняется в статическом методе, поэтому я могу вызывать его практически везде.
Я планирую тревогу, если и только нет такого ожидающего намерения. Что касается контекста - он доступен практически везде - в действии (это сам контекст) в широковещательном приемнике (параметр метода serice) и т. Д.
PS: широковещательный приемник предпочтительнее, чем сервис, потому что он не работает все время. Когда сервисный метод возвращается, он останавливается и приложение потенциально удаляется (разве что оно делает что-то еще, но в основном оно остается в фоновом режиме). Это обеспечивает лучшее время автономной работы