AlarmManager删除断电所有计划? [英] AlarmManager delete all schedules on power-off?

查看:221
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆