В Android вы можете установить AlarmManger
, чтобы просыпаться каждые X миллисекунд и запускать PendingIntent
.
Этот код выглядит примерно так.
AlarmManager mgr=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent i=new Intent(context, OnAlarmReceiver.class);
PendingIntent pi=PendingIntent.getBroadcast(context, 0, i, 0);
mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime()+60000,
PERIOD,
pi);
по умолчанию Android, IntentService
, который работает в фоновом режиме, имеет некоторые ограничения.
Вы также можете взглянуть на внешнюю библиотеку WakefulIntentService
(https://github.com/commonsguy/cwac-wakeful). Я использую это вместе с AlarmManager
для выполнения фоновых задач.
Обновлено:
OnAlarmReceiver класс
public class OnAlarmReceiver extends BroadcastReceiver {
public static String TAG = "OnAlarmReceiver";
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "Waking up alarm");
WakefulIntentService.sendWakefulWork(context, YourService.class); // do work in the service class
}
}
YourService класс
public class YourService extends WakefulIntentService {
public static String TAG = "YourService";
public YourService() {
super("YourService");
}
@Override
protected void doWakefulWork(Intent intent) {
Log.d(TAG, "Waking up service");
// do your background task here
}
}
Это, кажется, является хорошей отправной точкой. Я реализовал класс «OnAlarmReceiver», расширив «BroadcastReceiver». Нужно ли мне когда-нибудь вызывать 'registerReceiver', чтобы прослушать намерение, которое транслируется в третьей строке? Не удалось найти 'registerReceiver' в кодовой базе' WakefulIntentService', и я смущен. –
@MikeC Я обновил ответ с полным примером. Вы также должны будете определить свой сервис и получатель в файле манифеста, чтобы он работал. – Sharj
Я не закончил использование 'WakefulIntentService', но спасибо, что указал на правильное направление. –