Что я хочу: Чтобы запустить фоновую службу, которая будет взаимодействовать с нашим сервером через RESTful веб-сервиса после очередной интервал 1 мин (его строгое требование проекта Так не может увеличить его.).Длинный ход Фоновый процесс
Что у меня есть: Я пробовал различные подходы, используя простые BroadcastReceivers с простой службы И WakefulBroadcastReceivers используя WakefulIntentService и т.д ..
Основная проблема: 0: Основная проблема заключается в том, когда экран устройства включен, все работает нормально на регулярных/фиксированных интервалах, но когда экран выключается ИЛИ устройства блокируются, тогда диспетчер аварийных сигналов запускает сервис с минимальным интервалом 5 минут .. То точно, чего я не хочу. Я хочу один и тот же 1-минутный интервал, пока устройство заблокировано/выключено.
Ниже мой код:
Manifest.xml
<uses-permission android:name="android.permission.WAKE_LOCK" />
<receiver android:name=".MyScheduledReceiver" />
<service android:name=".BackgroundService" />
Activity.java
MyScheduledReceiver.scheduleAlarms(MainActivity.this);
Gradle
// Background long running process
compile 'com.commonsware.cwac:wakeful:1.0.+'
repositories {
maven {
url "https://s3.amazonaws.com/repo.commonsware.com"
}
}
BroadcastReceiver
public class MyScheduledReceiver extends WakefulBroadcastReceiver {
private static final int PERIOD = 60 * 1000;
private static final int INITIAL_DELAY = 2000; // 5 seconds
@Override
public void onReceive(Context context, Intent i) {
try {
if (i.getAction() == null) {
WakefulIntentService.sendWakefulWork(context, BackgroundService.class);
} else {
scheduleAlarms(context);
}
} catch (Exception e) {
e.printStackTrace();
}
}
static void scheduleAlarms(Context ctxt) {
AlarmManager mgr = (AlarmManager) ctxt.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(ctxt, MyScheduledReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(ctxt, 0, i, 0);
mgr.setRepeating(AlarmManager.RTC_WAKEUP, INITIAL_DELAY, PERIOD, pi);
}
}
BackgroundService
public class BackgroundService extends WakefulIntentService {
public BackgroundService() {
super("BackgroundService");
}
@Override
protected void doWakefulWork(Intent intent) {
sendNotification("HELLOO");
stopSelf();
}
@Override
public void onTaskRemoved(Intent rootIntent) {
MyScheduledReceiver.scheduleAlarms(BackgroundService.this);
super.onTaskRemoved(rootIntent);
}
private void sendNotification(String message) {
try {
Intent intent = intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Notification notification;
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("test")
.setContentText(message)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
notification = notificationBuilder.build();
notification.flags |= Notification.FLAG_FOREGROUND_SERVICE;
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
} catch (Exception e) {
e.printStackTrace();
}
}
}
В настоящее время я просто показываю уведомление со звуком в панели уведомлений из моей BackgroundService.
Я был бы очень признателен за вашу помощь. Благодаря !
Я думаю, что даже с помощью обработчиков он должен будет держать блокировку центрального процессора, чтобы сервисный пробег пока экран выключен. – Than
«Таймеры обычно работают по дружественному батарею ритму, когда это возможно» - OP не использует «Таймер», а «Таймер» не знает о батарее. Кроме того, этот конкретный подход к использованию «Handler» приведет к тому, что работа будет выполнена в основном потоке приложения, что не является хорошей идеей для службы. – CommonsWare
К сожалению, я имел ввиду AlarmManager. Эта часть правильная, правда, верно? Android запускает сигналы тревоги более или менее в нужное время, чтобы продолжать обработку до отрезков времени. В отличие от работы, когда они хотят, что может постоянно поддерживать устройство. – Knossos