Java 前台服务、报警管理器、通知显示

Java 前台服务、报警管理器、通知显示,java,android,push-notification,foreground-service,Java,Android,Push Notification,Foreground Service,我在前台服务、alarmManager和通知方面遇到一些问题 基本上,我正在尝试每天早上提供通知的服务。我正试图通过foregroundService和cpuWakeLock来实现这一点,但由于某些原因,我每天早上都很难得到这个通知。在模拟器中,一切正常 使用前台服务的主要原因是,如果没有它,我就无法在应用程序关闭时发出警报 我有点绝望 这是我的代码(清理版) 警报接收器类 public class AlertReceiver extends BroadcastReceiver { @Ove

我在前台服务、alarmManager和通知方面遇到一些问题

基本上,我正在尝试每天早上提供通知的服务。我正试图通过foregroundService和cpuWakeLock来实现这一点,但由于某些原因,我每天早上都很难得到这个通知。在模拟器中,一切正常

使用前台服务的主要原因是,如果没有它,我就无法在应用程序关闭时发出警报

我有点绝望

这是我的代码(清理版)

警报接收器类

public class AlertReceiver extends BroadcastReceiver {


@Override
public void onReceive(Context ctxt, Intent i) {

    Intent in = new Intent(ctxt, MentorService.class);
    in.putExtra("fromMain", "false");
    ctxt.startService(in);
}
}

这是我的清单文件:

<uses-permission android:name="android.permission.WAKE_LOCK" />
<service
            android:name=".MentorService"
            android:enabled="true"
            android:exported="true"
            android:process=".myprocess"
            android:stopWithTask="false" />

  • 您不需要服务来传递通知。它会耗尽你的电池电量
  • 使用报警管理器执行任务您可以在24小时后定期设置报警
  • 当一个警报触发时-生成下一个警报
除此之外,您还可以尝试GCMNetworkManager,它是Alarmmanager上的扩展

报警管理器代码:

private AlarmManager alarmMgr;
private PendingIntent alarmIntent;
...
alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

// Set the alarm to start at 8:30 a.m.
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 8);
calendar.set(Calendar.MINUTE, 30);

// setRepeating() lets you specify a precise custom interval--in this case,
// 20 minutes.
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
    1000 * 60 * 20, alarmIntent);
您的AlarmReceiver.class(即扩展BroadcastReceiver的类)将在您可以执行操作的地方触发: -创建您的通知。 -如果需要,修改下一个警报。

重复警报——因为您希望每天早上都收到通知


警报的工作效率很高,只需确保以毫秒为单位正确传递时间即可。它也可以在后台使用。

好的,谢谢。我会测试一下,然后让你们知道。很抱歉,我不明白这个设置的逻辑。在本例中,是每20分钟调用一次AlarmReceiver.class,还是只调用8:30?是的,您可以将其设置为24小时,而不是20分钟calendar.getTimeInMillis()是您的早晨时间miliesok。再次感谢。我只是想说清楚。为什么使用alarmMgr.setRepeating,为什么不使用alarmMagr.set?我的意思是每次使用caledar.set.都会发出新的警报。。然后不再重复。我还有第二个问题。如果我关闭应用程序,警报将不再显示。这是我使用前台服务的第一个原因。只是不能让警报系统只用广播接收器和警报来工作。
private AlarmManager alarmMgr;
private PendingIntent alarmIntent;
...
alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

// Set the alarm to start at 8:30 a.m.
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 8);
calendar.set(Calendar.MINUTE, 30);

// setRepeating() lets you specify a precise custom interval--in this case,
// 20 minutes.
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
    1000 * 60 * 20, alarmIntent);