2012-03-12 3 views
3

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

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

Да, вы должны установить его снова. – Akram

ответ

8

Прежде всего, необходимо создать 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> 
+0

Извините @Woodsy, у меня есть глупый вопрос, почему вы запускаете запрос непосредственно внутри метода OnStart? Разве это не операция, которую нужно сделать асинхронно? –

0

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

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

4

Пробные @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> 

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

Смежные вопросы