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