Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用AlarmManager和BroadcastReceiver调用自己的多个广播_Java_Android_Alarmmanager_Android Broadcastreceiver - Fatal编程技术网

Java 使用AlarmManager和BroadcastReceiver调用自己的多个广播

Java 使用AlarmManager和BroadcastReceiver调用自己的多个广播,java,android,alarmmanager,android-broadcastreceiver,Java,Android,Alarmmanager,Android Broadcastreceiver,我正在用Android构建一个水提醒应用程序,我想提醒用户在一天中多次喝水,而不需要用户打开该应用程序(以便将意图发送到广播接收器)。最好的方法是什么?这是我的密码: AlertReceiver.java import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.BroadcastReceiver

我正在用Android构建一个水提醒应用程序,我想提醒用户在一天中多次喝水,而不需要用户打开该应用程序(以便将意图发送到广播接收器)。最好的方法是什么?这是我的密码:

AlertReceiver.java

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;

public class AlertReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        createNotification(context, "DRINK", "Time to hydrate", "Alert");
    }

    public void createNotification(Context context, String msg, String msgText, String msgAlert) {

        PendingIntent notificationIntent = PendingIntent.getActivity(context, 0,
                new Intent(context, MainActivity.class), 0);

        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context)
                .setSmallIcon(R.drawable.ic_announcement)
                .setContentTitle(msg)
                .setContentText(msgText)
                .setTicker(msgAlert);

        notificationBuilder.setContentIntent(notificationIntent);

        notificationBuilder.setDefaults(Notification.DEFAULT_ALL);

        notificationBuilder.setAutoCancel(true);

        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

        notificationManager.notify(1, notificationBuilder.build());

    }

}
MainActivity.java的一部分

Long alertTime = nextAlarm.getTimeInMillis();
        Intent alertIntent = new Intent(this, AlertReceiver.class);

        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

        alarmManager.set(AlarmManager.RTC_WAKEUP, alertTime,
                PendingIntent.getBroadcast(this, 1, alertIntent,
                        PendingIntent.FLAG_UPDATE_CURRENT));

提前谢谢

是的,这是正确的方法。如果您需要呼叫调度重复警报,请检查链接。

更正您不需要后台服务。 你需要把它放在后台服务中

根据发布的教程中的信息。你可能没有把你的报警服务连接好

活跃

Long alertTime = nextAlarm.getTimeInMillis();
    Intent alertIntent = new Intent(this, AlertReceiver.class);

//ADD THIS
final PendingIntent pIntent = PendingIntent.getBroadcast(this, MyAlarmReceiver.REQUEST_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

 alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, firstMillis, AlarmManager.INTERVAL_HALF_HOUR, pIntent);

    // REMOVE THIS: 
   alarmManager.set(AlarmManager.RTC_WAKEUP, alertTime,
            PendingIntent.getBroadcast(this, 1, alertIntent,
                    PendingIntent.FLAG_UPDATE_CURRENT));

根据您提供的信息和该教程中的详细信息,这应该可以完成您需要做的事情

我已经读过了,但它没有解释如何在一天结束时停止闹钟,并在第二天的特定时间再次启动。这应该在用户无需打开应用程序的情况下发生。为此,您可以在收到广播时检查当前时间。您可以在显示通知时在
AlertReceiver
中安排下一个饮料警报。应该能够像你在活动中那样做。我还建议创建另一个接收器来查找引导完成的广播,因为当设备断电时,所有警报都会被删除。因此,你的意思是我应该完成整个过程,确定下一个警报何时应该在
AlertReceiver
中?这是一种方法,是的。这样,无论何时显示警报,它都会自动安排下一个警报。注意:用户仍然需要打开应用程序一次,以便可以注册初始警报。但在那之后,你的广播接收器可以处理警报的调度和显示。或者打开它,或者在它启动时广播它,对吗?你可以让你的活动检查当前是否安排了警报(这将在第一次打开时安排你的应用程序),您还需要一个单独的广播接收器,用于侦听BOOT_COMPLETED(设备重新启动/启动),该接收器将注册您的下一个警报,因为所有警报都在设备重新启动时被删除。我不明白这是如何工作的,您能举个例子说明在这种情况下我将如何执行此操作吗?(希望你明白我想做什么)。很抱歉这么多评论,但我仍然不知道如何在用户不打开应用程序的情况下停止当天的闹钟并在第二天再次启动。