所以,我有一个应用程序,每小时检查一个文本文件的更改.如果它发现更改,它需要给给予推送通知.但当我测试了一天的应用程序,它只工作的第一次.每隔一段时间,它只发生在我打开应用程序时inmediatly.我的curent代码如下:
主要活动:
on create
notificationManager = NotificationManagerCompat.from(this);
// sets time for when to notify/ check for rescheduling.
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 20);
calendar.set(Calendar.MINUTE, 01);
calendar.set(Calendar.SECOND, 00);
setAlarm(calendar);
字符串
设置报警
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
private void setAlarm(Calendar calendar) {
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 1, intent, 0);
alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
}
型
报警接收器:
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
NotificationHelper notificationHelper = new NotificationHelper(context);
NotificationCompat.Builder nb = notificationHelper.getChannelNotification();
notificationHelper.getManager().notify(1, nb.build());
}
}
型
NotificationHelper:
public class NotificationHelper extends ContextWrapper {
public static final String channelID = "Chanel1";
public static final String channelName = "Probably change";
private NotificationManager mManager;
public NotificationHelper(Context base) {
super(base);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
createChannel();
}
}
@TargetApi(Build.VERSION_CODES.O)
private void createChannel() {
NotificationChannel channel1 = new NotificationChannel(channelID, channelName, NotificationManager.IMPORTANCE_HIGH);
channel1.enableLights(true);
channel1.setLightColor(R.color.colorPrimary);
channel1.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
channel1.setImportance(NotificationManager.IMPORTANCE_HIGH);
getManager().createNotificationChannel(channel1);
}
public NotificationManager getManager() {
if (mManager == null) {
mManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
}
return mManager;
}
public NotificationCompat.Builder getChannelNotification(){
return new NotificationCompat.Builder(getApplicationContext(), channelID)
.setContentTitle("Schedule change")
.setContentText("There is probably a change in schedule for your class.")
.setSmallIcon(R.drawable.ic_launcher_foreground);
}
}
型
2条答案
按热度按时间h5qlskok1#
对于一个更现代的方法,你可能真的想使用Joblog而不是AlarmManager,但是任何一个都可以工作。
我看到的最重要的事情是你调用AlarmManager.setExact。这将安排闹钟发生一次,而且只发生一次。如果你想让它每小时发生一次,你要么需要调用setRepeating,要么你需要再次调用setExact来在你的闹钟处理程序中设置一个新的闹钟。
dzjeubhm2#
在我的情况下,我解决了它添加一些权限:
字符串