闹钟:重复setAlarmClock()
Alarm Clock: repeat setAlarmClock()
我正在尝试构建一个闹钟,用户可以在其中选择闹钟必须触发的时间和工作日。为此,我使用了 setAlarmClock()
,因为即使设备进入休眠模式,警报也必须触发。
问题是,setAlarmClock()
只是一次性警报,不能每周重复一次。
我能想到的唯一解决方案是制作一个 setRepeatingAlarm()
,每天安排 setAlarmClock()
。
请告诉我这是否是一个明智的解决方法,或者是否有更好的方法。
此外,我不确定是否必须通过广播接收器或其他服务安排每日 setAlarmClock()
。
如果您需要更多信息或代码片段,请告诉我。
经过很晚的时间,我找到了官方解决方案。您必须在每次重新启动后处理所有警报。我是通过以下方式完成的:
在清单中获取权限:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
然后使用以下 Intent 过滤器创建接收器:
<receiver android:name=".FragmentAlarm.RestartAlarmsReceiver" android:enabled="true"
android:exported="false">
<intent-filter>
<category android:name="android.intent.category.DEFAULT"/>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.QUICKBOOT_POWERON"/>
<!--For HTC devices-->
<action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
</intent-filter>
</receiver>`
接下来您需要创建这个接收器。我的看起来像这样:
public class RestartAlarmsReceiver extends BroadcastReceiver {
private String TAG = "halo";
@Override
public void onReceive(Context context, Intent intent) {
if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
Log.e("starting", "starting JobScheduler");
schedule(context);
} else {
Log.e(TAG, "Received unexpected intent " + intent.toString());
}
}
private void schedule(Context context) {
// say when Job has to be executed
ComponentName componentName = new ComponentName(context, JobServiceC.class);
JobInfo info = new JobInfo.Builder(145, componentName)
.setOverrideDeadline(0)
.setPersisted(true) // keeps job alive after reboot -> need permission
.build();
JobScheduler scheduler = (JobScheduler) context.getSystemService(JOB_SCHEDULER_SERVICE);
int resultCode = scheduler.schedule(info);
if (resultCode == JobScheduler.RESULT_SUCCESS) {
Log.e("TAG", "Job scheduled");
} else {
Log.e("TAG", "Job not scheduled");
}
}
private void cancel(Context context) {
JobScheduler scheduler = (JobScheduler) context.getSystemService(JOB_SCHEDULER_SERVICE);
scheduler.cancel(145);
Log.e("TAG", "JobCancelled");
}
这里你必须调整"Component Name",你必须在这里开始你的Java-class,它会再次设置这一天的所有闹钟。
我正在尝试构建一个闹钟,用户可以在其中选择闹钟必须触发的时间和工作日。为此,我使用了 setAlarmClock()
,因为即使设备进入休眠模式,警报也必须触发。
问题是,setAlarmClock()
只是一次性警报,不能每周重复一次。
我能想到的唯一解决方案是制作一个 setRepeatingAlarm()
,每天安排 setAlarmClock()
。
请告诉我这是否是一个明智的解决方法,或者是否有更好的方法。
此外,我不确定是否必须通过广播接收器或其他服务安排每日 setAlarmClock()
。
如果您需要更多信息或代码片段,请告诉我。
经过很晚的时间,我找到了官方解决方案。您必须在每次重新启动后处理所有警报。我是通过以下方式完成的:
在清单中获取权限:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
然后使用以下 Intent 过滤器创建接收器:
<receiver android:name=".FragmentAlarm.RestartAlarmsReceiver" android:enabled="true"
android:exported="false">
<intent-filter>
<category android:name="android.intent.category.DEFAULT"/>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="android.intent.action.QUICKBOOT_POWERON"/>
<!--For HTC devices-->
<action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
</intent-filter>
</receiver>`
接下来您需要创建这个接收器。我的看起来像这样:
public class RestartAlarmsReceiver extends BroadcastReceiver {
private String TAG = "halo";
@Override
public void onReceive(Context context, Intent intent) {
if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
Log.e("starting", "starting JobScheduler");
schedule(context);
} else {
Log.e(TAG, "Received unexpected intent " + intent.toString());
}
}
private void schedule(Context context) {
// say when Job has to be executed
ComponentName componentName = new ComponentName(context, JobServiceC.class);
JobInfo info = new JobInfo.Builder(145, componentName)
.setOverrideDeadline(0)
.setPersisted(true) // keeps job alive after reboot -> need permission
.build();
JobScheduler scheduler = (JobScheduler) context.getSystemService(JOB_SCHEDULER_SERVICE);
int resultCode = scheduler.schedule(info);
if (resultCode == JobScheduler.RESULT_SUCCESS) {
Log.e("TAG", "Job scheduled");
} else {
Log.e("TAG", "Job not scheduled");
}
}
private void cancel(Context context) {
JobScheduler scheduler = (JobScheduler) context.getSystemService(JOB_SCHEDULER_SERVICE);
scheduler.cancel(145);
Log.e("TAG", "JobCancelled");
}
这里你必须调整"Component Name",你必须在这里开始你的Java-class,它会再次设置这一天的所有闹钟。