我使用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是否停止工作,或者我的代码中存在异常,导致其无法正常工作。
答案 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();
}