从API 19以后,setRepeating不再准确。因此,采用了如下方法:
setWindow(int, long, long, PendingIntent)
setExact(int, long, PendingIntent)
从上面的两个方法我们可以看出,没有了repeat,就是设置了闹钟只能响一次了,而且这两种方法都可以设置精确的,第一个相对于第二种方法来说,应该是比较省电的。因为setWindow这个方法允许应用程序利用电池优化来自交货批处理即使它适度的及时性要求警报。
因此需要解决如下几个主要问题:
1.如何设置一个闹钟每天都准确提醒呢?
2.手机重启之后,设置的闹钟是否还有效?
3.应用程序被杀死之后,闹钟是否还有效?
1.如何设置一个闹钟每天都准确提醒呢?
提醒完毕可以再重新设置一次
public class AlarmReceiver extends BroadcastReceiver {
private AlarmManager alarmManager;
private PendingIntent operation;
@Override
public void onReceive(Context context, Intent intent) {
Log.i("test", "ProcessAlarmReceiver..........");
// context.startActivity(new Intent(context, MainActivity.class)
// .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
// 不能用startActivity,会导致生成无数个activity
alarm(context, intent);
}
/**
* 如何设置一个闹钟每天都准确提醒呢?提醒完毕可以再重新设置一次
*/
private void alarm(Context context, Intent intent) {
alarmManager = (AlarmManager) context
.getSystemService(Context.ALARM_SERVICE);
long triggerAtTime = System.currentTimeMillis();
long interval = 1000 * 5;// 5s
operation = PendingIntent.getBroadcast(context, 0, intent, 0);
alarmManager.setWindow(AlarmManager.RTC_WAKEUP, triggerAtTime,
interval, operation);
}
}
2.手机重启之后,设置的闹钟是否还有效?
监听开机启动(这项功能最好在虚拟机里测试,我的华为手机貌似把这项功能给屏蔽了)
public class BootCompleteReceiver extends BroadcastReceiver {
/**
* 手机重启之后,设置的闹钟是否还有效?
*/
@Override
public void onReceive(Context arg0, Intent arg1) {
arg0.startService(arg1);
}
}
3.应用程序被杀死之后,闹钟是否还有效?
在Service的onDestroy函数中调用startService
public class AlarmService extends Service {
private Intent intent;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
this.intent = intent;
sendBroadcast(new Intent("com.example.alarmtest.PROCESS_ALARM"));
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
/**
* 应用程序被杀死之后,闹钟是否还有效?
* 只要手机开机,应用程序就永久运行
*/
startService(intent);
}
}