У меня есть BroadcastReceiver
, который должен перезаписать аварийные сигналы AlarmManager после перезагрузки устройства. После перезагрузки запускается метод onReceive()
(я могу видеть вывод Log.v
в логарифме), но остальная часть кода не перенаправляет никаких аварийных сигналов. Может быть, есть что-то не так с ним, но LogCat показывает только это:Переопределение аварийных сигналов после перезагрузки устройства
LogCat:
11-25 15:51:17.680 2192-2212/system_process I/ActivityManager﹕ Start proc com.example.app for broadcast com.example.app/.BReceiver: pid=3668 uid=10080 gids={50080, 3003, 1015, 1028}
11-25 15:51:25.570 2192-2203/system_process I/ActivityManager﹕ No longer want com.example.app (pid 3668): empty #17
Приемник:
public class BReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.v("BOOT_COMPLETED", "RECEIVED"); // this is logged
DBScheduledRecords dbrec = new DBScheduledRecords(context);
Cursor cur = dbrec.selectAllRecords();
cur.moveToFirst();
while(cur.moveToNext()) {
int duration = cur.getInt(5);
String link = cur.getString(1);
int randomInt = cur.getInt(6);
Long start = cur.getLong(8);
Calendar today = Calendar.getInstance(); // current instance
if (today.getTimeInMillis() > start) {
start = start + (AlarmManager.INTERVAL_DAY * 7);
}
long lDuration = Long.parseLong(String.valueOf(duration * 60000));
Intent startIntent = new Intent(context, WakefulReceiver.class);
// startIntent.setAction("ALARM");
startIntent.putExtra("httpAddress", link);
startIntent.putExtra("millis", lDuration);
startIntent.putExtra("startInMillis", start);
startIntent.putExtra("randomInt", randomInt);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, randomInt, startIntent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
mAlarmManager.set(AlarmManager.RTC_WAKEUP, start, pendingIntent);
}
}
}
Не делайте ввода-вывода файлов в основной прикладной нити. Я бы переместил всю эту логику в «IntentService», начиная с 'onReceive()'. Помимо этого добавьте запись в свой цикл. – CommonsWare
Как я вижу, вы устанавливаете свою тревогу внутри цикла while. Вы уверены, что программный счетчик выходит внутрь цикла? – saiful103a
Вам не нужен цикл. Просто планируйте самый ранний сигнал тревоги, а затем, когда срабатывает будильник, запланируйте следующий. Нет необходимости устанавливать несколько аварийных сигналов, поскольку они всегда будут самыми ранними, которые будут срабатывать в первую очередь. – Kuffs