AlarmManager停止触发广播接收器

时间:2013-01-06 15:13:54

标签: android

我使用AlarmManager使用广播接收器在每分钟的顶部更新我的时钟小部件。这是我用来在widget onEnabled中设置闹钟的代码:

am.setRepeating(AlarmManager.RTC, 0, 60000, PendingIntent.getBroadcast(context, 0, new Intent(context, ReceiverClockUpdate.class), 0));

和此代码在onDisabled中停止它:

am.cancel(PendingIntent.getBroadcast(context, 0, new Intent(context, ReceiverClockUpdate.class), 0));

我有很多报告称时钟会在一段时间后停止更新(可能是1小时甚至1天),或者会因延迟而更新。报告最多的设备是Galaxy S3,Galaxy S2和Galaxy Note。

我不知道也没有线索为什么会发生这种情况。一段时间后,AlarmManager是否停止工作,或者我的代码中存在异常,导致其无法正常工作。

1 个答案:

答案 0 :(得分:0)

使用RTC_WAKEUP ..当手机只使用RTC睡眠时,闹钟管理器不会触发,它只会在手机唤醒时触发闹铃,弄乱60秒的时间间隔。

RTC_WAKEUP会在触发时唤醒手机睡眠模式,不会搞乱间隔,同样,你需要使用BOOT_COMPLETED动作进行闹铃,因为当手机关机时,它再打开,就不会有闹钟设置......

我认为你需要做一些算法,因为那就是我做的..

如果手机关闭了3分钟,然后打开,则需要类似

的内容
if(alarmtime < currenttime)
{
compute how many minutes have passed..
then make a variable of the minute that has passed.

variable = 3;
i = 0;
while(i<3)
{
update the clock one time
i++;
}

}

您需要在存储中保存闹钟时间,最好是SharedPref

更新:第一个代码是警报,第二个是服务。在这种情况下,警报将确定已经过了多少分钟,然后有相应的计数器。此代码仅检查3分钟,只需通过循环或其他东西添加变量

  public void onReceive(Context context, Intent intent) 
     {   
         PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
         PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
         wl.acquire();


         Toast.makeText(context, "A day has passed by.", Toast.LENGTH_LONG).show(); 

         wl.release();
         context.startService(new Intent(context, MySim.class));

        SharedPreferences a = context.getSharedPreferences("mPref",0);
        SharedPreferences.Editor editor = a.edit();



     }

 public void SetAlarm(Context context)
 {

     //retrieve alarms and getting current time
     SharedPreferences a = context.getSharedPreferences("mPref",0);

     long iFirst = a.getLong("first", System.currentTimeMillis()+(60*1000));
     long iSecond = a.getLong("second", System.currentTimeMillis()+(120*1000));
     long iThird = a.getLong("third", System.currentTimeMillis()+(180*1000));
     long currenttime = System.currentTimeMillis();
     SharedPreferences.Editor editor = a.edit();


     //editor passed =1 ililipat sa checkclassroom sa tunay na game
     //seting passed
     if(currenttime >= iFirst && currenttime < iSecond)
     {
         editor.putInt("passed", 1);
     }
     if(currenttime >= iSecond && currenttime < iThird)
     {
         editor.putInt("passed", 2);
         iFirst = iSecond;

     }
     if(currenttime >= iThird)
     {
         editor.putInt("passed", 3);
         iFirst = iThird;
     }
        editor.commit();




AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);



     Intent i = new Intent(context, Alarm.class);
     PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);


     am.setRepeating(AlarmManager.RTC,iFirst,60*1000, pi); 
 } 

这是服务:

             int passed = a.getInt("passed", 1);
            int counter = 1;
            while(counter <= passed)

            {
            //do the updating of the clock
            counter++;
            }

            editor.putLong("first", System.currentTimeMillis()+60 * 1000);
            editor.putLong("second", System.currentTimeMillis()+120 * 1000);
            editor.putLong("third", System.currentTimeMillis()+180 * 1000);
            editor.putInt("passed", 1);
            editor.commit();
        }