AlarmManager 在重启时重置

AlarmManager reset on reboot

我有一个闹钟,它会在用户选择的时间打开 activity。如果用户点击开始按钮,警报会正常,但在重启后会被取消。我到处都看了,它说我应该使用服务。是否可以在不使用服务的情况下在重启后保持警报?我是编码新手,所以请您分解一下我需要做什么。谢谢

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

广播接收器是

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

谢谢

phone 关机后,所有激活的警报都被取消。为了重置警报,您需要使用一个单独的 广播接收器 ,它将只接收启动完成的操作。然后接收器启动 service,这将在后台重置所有警报。最适合您的是 IntentService,因为它会在工作完成后自行结束。当然,您需要将有关警报的信息存储在某处,以便记住要重置哪些警报。例如,您可以使用 SQLite 来存储它们。

在您的清单中:

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

<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"/>

特殊接收者:

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

重启警报:

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

    }
}