AlarmManager удалить все расписания при отключении питания? - PullRequest
3 голосов
/ 12 марта 2012

Я установил будильник в определенное время. Если телефон выключен, будильник потерян? Я выключил телефон, запустил его снова, но будильник не сработал в указанное время.

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);

Ответы [ 3 ]

8 голосов
/ 12 марта 2012

Сначала вам нужно создать BroadcastReceiver для запуска на 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());
            }
    }
}

Затем создайте сервис для сброса всех ваших сигналов тревоги:

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);

    }
}

Наконец, добавьте разрешение иполучатель в манифест

 <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>
4 голосов
/ 13 ноября 2012

Пробовал @ Woodsy Метод, но не сработал, поэтому я исправил некоторые вещи, чтобы он мог работать

public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {

        Log.d("receiver", "The Receiver is called");
        Intent mServiceIntent = new Intent(context, BootService.class);
        context.startService(mServiceIntent);

    } else {
        Log.d("boot receiver ",
                "Something went wrong with the boot complete maybe with permissions ");
    }
}

}

* Разрешения и манифест *

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />



Booting update 
        <service android:name="com.packagename.appname.service.BootService" />

        <receiver
            android:name=".Receivers.BootReceiver"
            android:enabled="true" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" >
                </action>
            </intent-filter>
       </receiver>

Надеюсь, что это может помочь другим

0 голосов
/ 12 марта 2012

Вы можете сделать это следующим образом:

Сохранить время в SharedPreference, перехватить Intent.ACTION_BOOT_COMPLETED и снова установить AlarmManager, если требуется.

...