应用程序关闭时无法显示计划通知

时间:2016-07-04 07:13:24

标签: java android broadcastreceiver alarmmanager android-notifications

我使用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>

0 个答案:

没有答案
相关问题