Java AlarmManager在重新启动时重置

Java AlarmManager在重新启动时重置,java,android,android-service,alarmmanager,Java,Android,Android Service,Alarmmanager,我有一个警报,它在用户选择的时间打开一个活动。如果用户点击开始按钮,警报将正常运行,但在重新启动后会被取消。我到处都找过了,上面说我应该使用服务。是否可以在不使用服务的情况下在重新启动后保持警报打开?我是一个新的编码,所以你可以请细分我需要做什么。多谢各位 public class MainActivity extends AppCompatActivity { Button disable; Button start; TimePicker timePicker; @Override p

我有一个警报,它在用户选择的时间打开一个活动。如果用户点击开始按钮,警报将正常运行,但在重新启动后会被取消。我到处都找过了,上面说我应该使用服务。是否可以在不使用服务的情况下在重新启动后保持警报打开?我是一个新的编码,所以你可以请细分我需要做什么。多谢各位

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

谢谢

手机关机后,所有激活的闹钟都会被取消。为了重置警报,您需要使用单独的广播接收器,该接收器将只接收引导完成的操作。然后接收器启动服务,该服务将重置后台的所有警报。对您来说最好的方法是
IntentService
,因为工作完成后它会自动结束。当然,您需要将有关警报的信息存储在某个位置,以便记住要重置哪些警报。例如,您可以使用SQLite来存储它们

在您的舱单中:

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

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

    }
}

您需要一个
BroadcastReceiver
来监听系统何时启动,然后您需要从那里重置
AlarmManager
事件。如果它重置了这些事件,则无论用户是否想要警报,警报都会发出。我只希望在用户希望报警时报警。是的,我通常将报警保存在
SharedReference
中,并在报警一响就将其删除。因此,在您的
接收器中
只需安排您首选项中的所有警报。这当然取决于您的用例。您是否为报警打开和报警关闭事件创建布尔值?我想这么做,但我认为可能有问题。我不知道怎么会有问题,因为我们只能在UI线程中读/写
SharedReference
。我还没有发现任何问题。服务是否会在用户要求报警时启动?服务只会在重新启动后启动一次。它自己工作。您需要编写代码,以便服务检查数据库中所有已注册的报警。在那里,您只需要存储活动报警。如果用户取消特定报警,则需要将其从数据库中删除或将其标记为非活动。所以,你的服务只重置必要的警报。我不熟悉编码。我不知道该怎么做。对不起,首先,您需要创建数据库。它可以是SQLite,也可以是共享首选项。当用户按下按钮设置一些报警时,
setOnClickListener
中的代码被计算出来并设置报警。只需包括设置报警后将报警存储在db中的代码。然后在您的IntentService中简单地阅读它。有许多关于如何创建和使用db的教程。搜索它们,你就会明白。这很简单,不用担心,就像设置报警信息时将报警信息存储在db中一样,您需要包含删除用户取消的报警信息的代码。类似的代码需要包含在
禁用
按钮的
onClickListener
中。就这些!
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

    }
}