I think you have two inherent problems with this approach:
AlarmManager will not accept large periods of time because the number of milliseconds will overflow the argument
I do not think that Alarms will survive the reboot of your phone, which will certainly happen over such a long period of time.
I advise you to keep each alarm in a safe place and use a combination of AlarmManager and onBoot receivers to check if you need to fire one of the alarms from your list that day and just move the alarm to wake you up tomorrow, if not.
public class AlarmService extends Service { //compat to support older devices @Override public void onStart(Intent intent, int startId) { onStartCommand(intent, 0, startId); } @Override public int onStartCommand (Intent intent, int flags, int startId){ //your method to check if an alarm must be fired today checkForTodayAlarmsAndBehaveAppropriately(); //reschedule me to check again tomorrow Intent serviceIntent = new Intent(AlarmService.this,AlarmService.class); PendingIntent restartServiceIntent = PendingIntent.getService(AlarmService.this, 0, serviceIntent,0); AlarmManager alarms = (AlarmManager)getSystemService(ALARM_SERVICE); // cancel previous alarm alarms.cancel(restartServiceIntent); // schedule alarm for today + 1 day Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.DATE, 1); // schedule the alarm alarms.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), restartServiceIntent); } }
To start the service at boot time, use this:
import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class serviceAutoLauncher extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { Intent serviceIntent = new Intent(context,AlarmService.class); context.startService(serviceIntent); } }
Finally, add this to your manifest to schedule serviceAutoLauncher to run on every boot:
<receiver android:name="serviceAutoLauncher"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED"></action> <category android:name="android.intent.category.HOME"></category> </intent-filter> </receiver>
source share