在 Android 中的每周一安排通知

Posted

技术标签:

【中文标题】在 Android 中的每周一安排通知【英文标题】:Schedule notification at Monday of every week in Android 【发布时间】:2018-12-14 06:02:44 【问题描述】:

想要安排在每周一上午 11 点触发的通知。 我正在为此使用firebase作业调度程序。 这是我已经实现的代码 sn-p 但这不起作用。

    Calendar currentDate = Calendar.getInstance();
    while (currentDate.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) 
        currentDate.add(Calendar.DATE, 1);
    
    currentDate.set(Calendar.HOUR_OF_DAY, 11);
    currentDate.set(Calendar.MINUTE, 0);
    currentDate.set(Calendar.SECOND, 0);
    currentDate.set(Calendar.MILLISECOND, 0);
    FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(SplashScreen.this));

    Job myJob = dispatcher.newJobBuilder()
            .setService(ScheduledNotificationService.class)
            .setTag(dispatcherTag)
            .setRecurring(true)
            .setLifetime(Lifetime.FOREVER)
            .setTrigger(Trigger.executionWindow(Math.round(currentDate.getTime().getTime() / 1000), Math.round(currentDate.getTime().getTime() / 1000) + 60))
            .setReplaceCurrent(false)
            .setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL)
            .build();

    dispatcher.mustSchedule(myJob);

ScheduledNotificationService.class 扩展了 jobservice 但永远不会调用 onStartJob。

这里有什么问题?

除了使用 Firebase 作业调度程序之外,还有什么更好/正确的方法吗?

【问题讨论】:

我假设您的这段代码 sn-p 在 SplashScreen 或 MainActivity 中被调用?您是否在 Manifest 中注册了该服务。 它在 SplasScreen 中被调用,但我想 setReplaceCurent(false) 不会造成任何麻烦。是的,ScheduledNotificationService.class 已在 androidManifest 文件中注册。 您可以尝试将其测试为每 30 秒运行一次,而不是周一上午 11:00,看看它是否有效。当您的启动画面也打开时,检查您的 android 日志在 logcat 中。它说了什么。 我试过了,但服务没有被调用。我怀疑, .setTrigger(Trigger.executionWindow(Math.round(currentDate.getTime().getTime() / 1000), Math.round(currentDate.getTime().getTime() / 1000) + 60)) 在不知何故,不确定到底是什么。 【参考方案1】:

FirebaseJobDispatcher 并没有真正起到帮助作用,所以我改用了 AlarmManager,它的工作原理就像一个魅力。 这是我实现它的方法,

    Calendar currentDate = Calendar.getInstance();
    while (currentDate.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) 
        currentDate.add(Calendar.DATE, 1);
    
    currentDate.set(Calendar.HOUR_OF_DAY, hour);
    currentDate.set(Calendar.MINUTE, minute);
    currentDate.set(Calendar.SECOND, 0);
    currentDate.set(Calendar.MILLISECOND, 0);

    Intent intent = new Intent(mContext, AlarmReceiver.class);
    intent.putExtra("extra info", "if needed");
    PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, RequestCode, intent, 0);
    AlarmManager am = (AlarmManager) mContext.getSystemService(ALARM_SERVICE);
    am.setRepeating(am.RTC_WAKEUP, currentDate.getTimeInMillis(), am.INTERVAL_DAY * 7, pendingIntent);

AlarmReceiver 类执行任何操作

 public class AlarmReceiver extends BroadcastReceiver 

    private Context mContext;

    @Override
    public void onReceive(Context context, Intent data) 
        mContext = context;
        //YOUR STUFF 
    

用户重新启动设备后,此计划将停止工作。重启完成后不要忘记再次设置。 为此,请在 AndroidManifest 中添加此内容并再次安排闹钟。

    <receiver
        android:name=".AlarmManager.AlarmBootReceiver"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>

在 AlarmBootReceiver 类中再次安排警报。

【讨论】:

以上是关于在 Android 中的每周一安排通知的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中每周安排闹钟?

无法在 Android 上使用 AlarmManager 安排通知(使用 Qt)

在特定时区安排 UILocalNotification

如何安排在上午 9 点执行代码

ios重复本地通知

Android 使用通知