我使用Android中的Alarm Manager服务进行了一些推送通知,该服务使用广播接收器来监听警报。但是当我从最近的任务中刷掉应用程序时,通知无法在预定的时间内显示。仅供参考 - 我想要通知,其中有多个需要每天显示,从上午8点到晚上8点均匀分布。
这是我在MainActivity中的功能,我打电话来计算闹钟时间。整数scheduled_tests包含我希望每天显示的通知数,test_interval是通知之间的间隔,以便它们在每天上午8点到晚上8点均匀分配。
public void computeAlarmTimes() {
int scheduled_tests = Integer.parseInt(sessionManager.getStringSessionPreferences(getApplicationContext(), "user_scheduled_tests", "3"));
float test_interval = 12/(scheduled_tests-1);
long interval_millis = ((long) test_interval)*60*60*1000;
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 8);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
alarmPendingIntents = new ArrayList<>();
for (int i=0; i<scheduled_tests; i++) {
if (calendar.getTimeInMillis()+(i*interval_millis) > Calendar.getInstance().getTimeInMillis()) {
int requestCode = (i + 1) * 111;
Intent intent = new Intent(getApplicationContext(), NotificationReceiver.class);
intent.putExtra("requestCode", requestCode);
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis() + (i * interval_millis), AlarmManager.INTERVAL_DAY, pendingIntent);
alarmPendingIntents.add(pendingIntent);
}
}
}
然后我在MainActivity的onCreate()方法中调用该函数
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
computeAlarmTimes();
}
这是我的NotificationReceiver类,它扩展了BroadcastReceiver
public class NotificationReceiver extends BroadcastReceiver {
private NotificationManager notificationManager;
private Intent notificationIntent;
private PendingIntent pendingIntent;
private int requestCode;
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
} else {
notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationIntent = new Intent(context, MainActivity.class);
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
requestCode = intent.getExtras().getInt("requestCode");
pendingIntent = PendingIntent.getActivity(context, requestCode, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
notificationCreator(context, requestCode);
}
}
private void notificationCreator(Context context, int requestCode) {
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context)
.setContentIntent(pendingIntent)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("Neatometer Notification " + String.valueOf(requestCode))
.setContentText("It's time to take another Sketch Test")
.setVibrate(new long[] {1000, 1000, 1000})
.setDefaults(Notification.DEFAULT_SOUND)
.setAutoCancel(true);
notificationManager.notify(requestCode, notificationBuilder.build());
}
}
最后,这是我AndroidManifest文件中的主要片段
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver android:name=".NotificationReceiver"
android:process=":remote"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>