当前位置: 首页 > 知识库问答 >
问题:

在指定时间未触发报警和通知

慕阳伯
2023-03-14

我试图在指定时间触发通知和警报。我已经将日志信息放在控制台上,以查看是否设置了正确的时间,并且一切正常。但是,仍然没有触发警报。请帮忙。

创建通知和警报的/Code/

btn_add_task.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                db.addTask(new DataModel(input_task_title.getText().toString(),input_task_desc.getText().toString(),
                        checkBox.isChecked(),txtDate.getText().toString(),txtTime.getText().toString(),isComplete));

                Calendar calendar = Calendar.getInstance();
                //Set notification for the set date and time
                calendar.set(Calendar.MONTH, month);
                calendar.set(Calendar.YEAR, year);
                calendar.set(Calendar.DAY_OF_MONTH, day);
                calendar.set(Calendar.HOUR_OF_DAY, hour);
                calendar.set(Calendar.MINUTE, minute);
                calendar.set(Calendar.SECOND, 0);
                if(mHour>12) {
                    calendar.set(Calendar.AM_PM, Calendar.PM);
                } else {
                    calendar.set(Calendar.AM_PM, Calendar.AM);
                }

                Log.i("Alarm at: ",calendar.get(Calendar.DAY_OF_MONTH)+"-"+
                        calendar.get(Calendar.MONTH)+"-"+
                        calendar.get(Calendar.YEAR)+" at "+
                        calendar.get(Calendar.HOUR_OF_DAY)+":"+
                        calendar.get(Calendar.MINUTE));

                Intent notifyMessage = new Intent(getApplicationContext(),NotificationMessage.class);
                PendingIntent pi = PendingIntent.getService(getApplicationContext(), 0, notifyMessage, PendingIntent.FLAG_UPDATE_CURRENT);
                AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
                am.setRepeating(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),AlarmManager.INTERVAL_DAY,pi);

                Toast.makeText(getApplicationContext(),R.string.new_task_added,Toast.LENGTH_LONG).show();
                startActivity(new Intent(AddTask.this,MainActivity.class));
            }
        });

/通知消息类/

package com.apps.katz.doer;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.support.v4.app.NotificationCompat;
import android.util.Log;

/**
 * Created by katz on 4/5/16.
 */
public class NotificationMessage extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        showNotification(context);
    }

    private void showNotification(Context context) {
        Log.i("notification","visible");
        PendingIntent contentIntent = PendingIntent.getActivity(context,0,
                new Intent(context,NotificationMessage.class),0);
        NotificationCompat.Builder mBuilder =
                new NotificationCompat.Builder(context).setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("Doer Notification")
                .setContentText("This is a Doer Notification");
        mBuilder.setContentIntent(contentIntent);
        mBuilder.setDefaults(Notification.DEFAULT_SOUND);
        mBuilder.setDefaults(Notification.DEFAULT_VIBRATE);
        mBuilder.setDefaults(Notification.DEFAULT_LIGHTS);
        mBuilder.setAutoCancel(true);
        NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        manager.notify(1,mBuilder.build());
    }
}

请帮帮我,我做错了什么?

共有2个答案

吕向荣
2023-03-14

btn_add_task监听器内部,设置闹钟如下-

Intent notifyMessage = new Intent(getApplicationContext(),NotificationMessage.class);
PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), 0, notifyMessage, PendingIntent.FLAG_UPDATE_CURRENT);    
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),AlarmManager.INTERVAL_DAY,pi);

现在,在NotificationMessage类的onReceive中放置一个日志,以确保及时触发警报。希望,现在您的程序将运行。

越飞语
2023-03-14

看看setRepeating方法的留档:

注意:从API 19开始,所有重复警报都是不精确的。如果您的应用程序需要精确的交付时间,那么它必须使用一次性精确警报,并如上所述重新安排每次。目标SdkVersion早于API 19的旧版应用程序将继续将其所有警报(包括重复警报)视为精确。

您的警报将不准确总是使用setRepeating,尝试使用setExact并在触发警报时重新编程。

此外,请尝试扩展WakefulBroadcastReceiver,而不是在NotificationMessage中扩展WakefulBroadcastReceiver,以便在应用程序未运行时唤醒服务。

 类似资料:
  • 我试图在应用程序启动10分钟后生成警报。根据我的要求,无论用户关闭应用程序、关闭并再次打开,或者甚至在重新启动后,此警报都应该工作。下面是我的代码。 主要活动。Java语言 我的服务。java—这是服务类。 警报eciever.java 如果我没有关掉手机或重新启动手机,我就可以准时收到闹钟。我准时收到闹钟。 然而,如果我关闭并打开手机,或者如果我重新启动手机,我会在手机打开/重新启动后立即收到警

  • 我管理一切都很好,创建了一个通知服务,用于作为警报的结果触发通知。不幸的是,使用AlarmManager设置警报不能正常工作。它会在几分钟后触发(而不是几小时,这将表示时区问题)。循环周期为1周,所以我使用了常数INTERVAL_DAY,并将其乘以7。为了确保一个PendingIntent不会替换另一个,我将dayOfWeek作为第二个参数传递给PendingIntent.getService()

  • 我有一个场景,我需要安排一个工作,必须每天在特定时间执行。当我用特定的时间作为调度器的开始时间来调度它时,quartz不会在设定的开始时间触发作业,而是在下一个周期即延迟24小时后触发作业。即使在检查下一个FireTime时,我们也会得到一天的延迟。 例如:我需要每天安排一项工作在晚上6点进行。今天(2018年3月27日)下午5点开始。工作没有开始,下一次火灾时间是2018年3月28日下午6点。

  • 配置报警策略的时候open-falcon支持多种报警触发函数,比如all(#3) diff(#10)等等。 这些#后面的数字表示的是最新的历史点,比如#3代表的是最新的三个点。该数字默认不能大于10,大于10将当作10处理,即只计算最新10个点的值。 说明:#后面的数字的最大值,即在 judge 内存中保留最近几个点,是支持自定义的,具体参考 book 中描述 ; 源码位置 => cfg.exam

  • 我每天上午11点使用显示通知。 当我在应用程序中设置警报时,警报会在短时间后触发。

  • 我试着在点击元素HomeNav下的导航栏中的第二个li时显示警报。您可以在codepen上签出完整的代码 HTML