为什么我的Android通知在未来不会触发,只有过去?

时间:2016-10-16 12:49:26

标签: android date datepicker notifications alarmmanager

我已经四处寻找并且在我的智慧结束时遇到了Android通知问题。

我正在尝试实施通知,以便在用户从DatePicker,例如始终在所选日期的08:00 )选择日期的预定义时间触发

通知可以在我手动触发的同时工作,因此我知道它的代码可以正常工作。

我通过从Calendar回调中抓取日期来填充我的DatePicker并且可以记录它以便我知道我使用的日期是正确的,并且我将此转换为毫秒到用于设置闹钟。

如果我选择过去的日期或时间(根据Android的默认操作),通知会立即触发,因此它会将我的日期和时间识别为有效,以便知道它是在过去。

但问题是,如果我在将来设定时间,它就不会触发,而我根本无法解决原因。

这是onDateSet()方法回调来自DatePicker我获得年,月和日,然后设置HOUR_OF_DAYMINUTE目前设置为13:15用于测试目的)...

//Add the chosen date to the DB (for the birthday)
//Callback implemented from DatePickerFragment Class
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
    //Create a new string from the date
    String date = String.valueOf(new StringBuilder()
            .append(dayOfMonth)
            .append("-")
            .append(month + 1)
            .append("-")
            .append(year));

    updateDB_Birthday(date);
    dbHelper.updateIsOwned(beanieID, 1);

    //Convert date set to millis for use with notifying when set
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.YEAR, year);
    calendar.set(Calendar.MONTH, month);
    calendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
    calendar.set(Calendar.HOUR_OF_DAY, 13);
    calendar.set(Calendar.MINUTE, 15);
    calendar.set(Calendar.SECOND, 0);
    long myTime = calendar.getTimeInMillis();

    Log.v("z! Calendar", "" + calendar.getTime());

    //Create Notification to go off on the beanie's birthday
    notificationAlarmManager(myTime);
}

...这是我的通知闹钟管理器...

private void notificationAlarmManager(long myTime) {

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

    notificationReceiver notificationReceiver = new notificationReceiver();
    IntentFilter filter = new IntentFilter("ALARM_ACTION");
    registerReceiver(notificationReceiver, filter);

    Intent intent = new Intent("ALARM_ACTION");
    intent.putExtra("param", "My scheduled action");
    PendingIntent operation = PendingIntent.getBroadcast(this, 0, intent, 0);

    alarmManager.set(AlarmManager.RTC_WAKEUP, myTime, operation);
}

...这是我的BroadcastReceiver类...

public class notificationReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        android.support.v4.app.NotificationCompat.Builder builder =
                new NotificationCompat.Builder(context)
                        .setSmallIcon(beanieImage)
                        .setContentTitle("Beanie Notification")
                        .setContentText("It's " + beanieName + "'s Birthday today!")
                        .setDefaults(Notification.DEFAULT_ALL);

        //Add an intent
        Intent notificationIntent = new Intent(context, ItemDetail.class);
        notificationIntent.putExtra("EXTRAS_ID", beanieID);
        notificationIntent.putExtra("EXTRAS_NAME", beanieName);
        notificationIntent.putExtra("EXTRAS_IMAGE", beanieImage);
        notificationIntent.putExtra("EXTRAS_BIRTHDAY", beanieBirthday);
        notificationIntent.putExtra("EXTRAS_IS_OWNED", isOwned);

        //Add pending intent
        PendingIntent pendingIntent =
                PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        //Launch activity on click of notification
        builder.setContentIntent(pendingIntent);

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

        notificationManager.notify(001, builder.build());
    }
}

我已经被困在这几天了,这是完成这个应用程序所需要的最后一件事,所以任何帮助都会受到很多人的赞赏。

提前致谢,

P.S。 昨天我问了一个类似的问题here,但显然我的问题“没有显示出足够的研究成果”,尽管这是我的研究让我走得这么远。我已经做了很多“家庭作业”,所以请不要认为我轻轻地参加这个论坛,这几乎是最后的要求。

1 个答案:

答案 0 :(得分:0)

所以有些如何,我能够找到它为什么不起作用。 这是答案。这个对我有用。 在AndroidManifest.xml中,将以下接收器添加到application元素。

<receiver android:name=".notificationReceiver"
     android:enabled="true">
     <intent-filter>
     <action android:name="android.intent.action.BOOT_COMPLETED"/>
      </intent-filter>
</receiver>

或者只是像这样注册

    <receiver 
        android:name=".notificationReceiver"
    </receiver>