2013-11-25 3 views
2

У меня есть 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); 


    } 

} 
} 
+1

Не делайте ввода-вывода файлов в основной прикладной нити. Я бы переместил всю эту логику в «IntentService», начиная с 'onReceive()'. Помимо этого добавьте запись в свой цикл. – CommonsWare

+1

Как я вижу, вы устанавливаете свою тревогу внутри цикла while. Вы уверены, что программный счетчик выходит внутрь цикла? – saiful103a

+0

Вам не нужен цикл. Просто планируйте самый ранний сигнал тревоги, а затем, когда срабатывает будильник, запланируйте следующий. Нет необходимости устанавливать несколько аварийных сигналов, поскольку они всегда будут самыми ранними, которые будут срабатывать в первую очередь. – Kuffs

ответ

0

Как показали там было несколько проблем здесь, но причина того, «no effect» в logcat был вызван: while(cur.moveToNext()) плюс тот факт, что у меня была только одна строка в моей базе данных (курсор poitner был уже позади только строки в БД после вызова moveToNext()). Сейчас я использую:

while(cur.getCount() > cur.getPosition()) { 
    // 
    cur.moveToNext(); 
} 

В то же время (в то время как я думал о причине такого поведения) я переместил код в IntentService как предложено @CommonsWare.

Спасибо за ваши комментарии. Это было действительно полезно.

Смежные вопросы