AlarmManager删除断电所有计划? [英] AlarmManager delete all schedules on power-off?
本文介绍了AlarmManager删除断电所有计划?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我已经设置在特定的时间报警。如果手机关闭闹钟丢失?我已经关掉手机,再次启动,但警报并未在指定时间触发。
的PendingIntent的PendingIntent = PendingIntent.getBroadcast(
Global.a.getApplicationContext(),(INT)cd.e.alarmTime,意图,0); AlarmManager alarmManager =(AlarmManager)Global.a.getSystemService(Activity.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC,cd.e.alarmTime,的PendingIntent);
解决方案
首先,你需要创建一个广播接收器
触发BOOT_COMPLETE
公共类BootReceiver扩展广播接收器{ @覆盖
公共无效的onReceive(最终上下文的背景下,最终的意图意图){
如果(android.intent.action.BOOT_COMPLETED.equals(intent.getAction())){
意图mServiceIntent =新的Intent();
mServiceIntent
.setAction(com.crossfire.appname.service.BootService);
组件名服务= context.startService(mServiceIntent);
如果(空==服务){
//东西真的错在这里
Log.e(TAG,无法启动服务);
}
}其他{
Log.e(TAG,收到意想不到的意图+ intent.toString());
}
}
}
然后创建一个服务于所有的报警复位:
公共类BootService延伸服务{ 私人最终字符串标记=BootService; @覆盖
公众的IBinder onBind(最终意向意图){
返回null;
} @覆盖
公共无效的onCreate(){
super.onCreate();
Trace.i(TAG,创造);
} @覆盖
公共无效调用onStart(最终意图的意图,最终诠释startId){
super.onStart(意向,startId);
Trace.i(TAG,启动); LoadAlarmsFromDatabase(); } 私人无效LoadAlarmsFromDatabase(){
光标C = mDbHelper.getPendingAlarms();
如果(c.moveToFirst()){
做{ INT ID = c.getInt(mDbHelper.ID_COLUMN);
字符串时间= c.getString(mDbHelper.TIME_COLUMN);
addNotification(ID,时间);
}而(c.moveToNext());
}
c.close();
} 私人无效addNotification(INT apptId,字符串时间){
Trace.d(TAGaddNotification+ apptId +,+时间);
意向意图=新意图(BootService.this,
ApptBroadcastReceiver.class); intent.putExtra(appt_id,Integer.toString(apptId)); 的PendingIntent mAlarmSender = PendingIntent.getBroadcast(
BootService.this,apptId,意向,0); 长alarmTime = System.currentTimeMillis的()+ 60000;
日历C = NULL; 尝试{
C = CustomDateUtils.StringToCalendar(时间);
alarmTime = c.getTimeInMillis();
}赶上(ParseException的E){
Log.e(TAGParseException的);
} AlarmManager AM =(AlarmManager)getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP,alarmTime,mAlarmSender); }
}
最后,添加的权限,并接收到清单
<使用许可权的android:NAME =android.permission.RECEIVE_BOOT_COMPLETED/>
<接收机器人:receiver.BootReceiverNAME =机器人:启用=真正的>
&所述;意图滤光器>
<作用机器人:名字=android.intent.action.BOOT_COMPLETED>< /作用>
&所述; /意图滤光器>
< /接收器>
I have set an alarm at specific time. If the phone is turn off the alarm is lost? I have turn off the phone, start it again but the alarm did not trigger at the specified time.
PendingIntent pendingIntent = PendingIntent.getBroadcast(
Global.a.getApplicationContext(), (int) cd.e.alarmTime, intent, 0);
AlarmManager alarmManager = (AlarmManager) Global.a.getSystemService(Activity.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC, cd.e.alarmTime, pendingIntent);
解决方案
First you need to create a BroadcastReceiver
to trigger on BOOT_COMPLETE
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
Intent mServiceIntent = new Intent();
mServiceIntent
.setAction("com.crossfire.appname.service.BootService");
ComponentName service = context.startService(mServiceIntent);
if (null == service) {
// something really wrong here
Log.e(TAG, "Could not start service ");
}
} else {
Log.e(TAG, "Received unexpected intent " + intent.toString());
}
}
}
Then create a service to reset all your alarms:
public class BootService extends Service {
private final String TAG = "BootService";
@Override
public IBinder onBind(final Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
Trace.i(TAG, "created");
}
@Override
public void onStart(final Intent intent, final int startId) {
super.onStart(intent, startId);
Trace.i(TAG, "started");
LoadAlarmsFromDatabase();
}
private void LoadAlarmsFromDatabase() {
Cursor c = mDbHelper.getPendingAlarms();
if (c.moveToFirst()) {
do {
int id = c.getInt(mDbHelper.ID_COLUMN);
String time = c.getString(mDbHelper.TIME_COLUMN);
addNotification(id, time);
} while (c.moveToNext());
}
c.close();
}
private void addNotification(int apptId, String time) {
Trace.d(TAG, "addNotification " + apptId + ", " + time);
Intent intent = new Intent(BootService.this,
ApptBroadcastReceiver.class);
intent.putExtra("appt_id", Integer.toString(apptId));
PendingIntent mAlarmSender = PendingIntent.getBroadcast(
BootService.this, apptId, intent, 0);
long alarmTime = System.currentTimeMillis() + 60000;
Calendar c = null;
try {
c = CustomDateUtils.StringToCalendar(time);
alarmTime = c.getTimeInMillis();
} catch (ParseException e) {
Log.e(TAG, "ParseException");
}
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, alarmTime, mAlarmSender);
}
}
Finally, add the permission and receiver to the manifest
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver android:name=".receiver.BootReceiver" android:enabled="true">
<intent-filter>
<action android:name ="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
这篇关于AlarmManager删除断电所有计划?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文