闹钟:重复 setAlarmClock()

Fel*_*egg 5 java alarmmanager android-studio

我正在尝试构建一个闹钟,用户可以在其中选择闹钟必须触发的时间和工作日。为此,我使用了setAlarmClock(),因为即使设备进入打瞌睡模式,警报也必须触发。问题是,这setAlarmClock()只是一次性警报,不能每周重复一次。我能想到的唯一解决方案是制作一个setRepeatingAlarm(),安排setAlarmClock()每天的日程。

请告诉我这是否是一个明智的解决方法或者是否有更好的方法。

另外,我不确定我是否必须setAlarmClock()从广播接收器或附加服务中安排每日日程。

如果您需要更多信息或代码片段,请告诉我。

Fel*_*egg 1

经过很晚的时间我找到了官方解决方案。每次重启后您都必须处理所有警报。我通过以下方式完成了此操作:

在清单中获取许可:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
Run Code Online (Sandbox Code Playgroud)

然后使用以下 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>`
Run Code Online (Sandbox Code Playgroud)

接下来您需要创建这个接收器。我的看起来像这样:

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");
}
Run Code Online (Sandbox Code Playgroud)

在这里您必须调整“组件名称”,您必须在其中启动 Java 类,这将再次设置当天的所有警报。