DroidGalaxy
DroidGalaxy

Reputation: 109

AlarmManager reset on reboot

I've an alarm which opens an activity at a time chosen by the user. If the user hits the start button, the alarm goes fine but it gets cancelled after reboot. I've looked everywhere and it says that I should use a service. Is it possible to keep the alarms on after the reboot without using service? I'm new to coding so can you please breakdown what I need to do. Thank you

public class MainActivity extends AppCompatActivity {

Button disable;
Button start;
TimePicker timePicker;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    timePicker = (TimePicker) findViewById(R.id.timePicker);
    disable = (Button) findViewById(R.id.disable_alarm);
    start = (Button) findViewById(R.id.button);


    start.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
             Calendar calendar = Calendar.getInstance();
                calendar.set(Calendar.HOUR_OF_DAY, timePicker.getHour());
                calendar.set(Calendar.MINUTE, timePicker.getMinute());

                Intent intent = new Intent(getApplicationContext(),notification.class);

                PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 100, intent, PendingIntent.FLAG_UPDATE_CURRENT);
                AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
                alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 120*1000, pendingIntent);

        }
    });

    disable.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(getApplicationContext(),notification.class);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 100, intent, PendingIntent.FLAG_UPDATE_CURRENT);
            AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
            alarmManager.cancel(pendingIntent);
        }
    });

and Broadcast Receiver is

public class notification extends BroadcastReceiver {



@Override
public void onReceive(Context context, Intent intent) {

    Intent scheduledIntent = new Intent(context, pop_up2.class);
    scheduledIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(scheduledIntent);}}

Thanks

Upvotes: 2

Views: 1809

Answers (1)

Marat
Marat

Reputation: 6703

All of the active alarms are cancelled after phone is shutdown. In order to reset the alarms you need to use a separate broadcast receiver that will receive only boot completed action. The receiver then starts service that will reset all your alarms in background. Best one for you is IntentService, because it ends itself when the work is done. Of course you need to store the information about alarms somewhere in order to remember which ones to reset. You can use, for example, SQLite to store them.

In your manifest:

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

and

<receiver android:name="developer.marat.apps.days.Alarms.BootCompletedReceiver"
    android:enabled="true">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

<service android:name="developer.marat.apps.days.Alarms.RestartAlarmsService"/>

Special receiver:

public class BootCompletedReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {

        if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
            Intent i = new Intent(context, RestartAlarmsService.class);
            ComponentName service = context.startService(i);
        }
    }
}

RestartAlarms:

public class RestartAlarmsService extends IntentService{

    public RestartAlarmsService() {
        super("RestartAlarmsService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {

        // Restart your alarms here.
        // open database, iterate through every alarm and set them again

    }
}

Upvotes: 3

Related Questions