在 android 中发出通知

Making a Notification in android

我有一个从 github 中获取的日历库:https://github.com/prolificinteractive/material-calendarview

然后我让用户点击一个日期并为该日期添加一个提醒,然后弹出一个警告对话框并要求他们输入他们希望在那天收到提醒的时间。

现在我能够将文本转换为简单日期格式,并从日历对象中将其输出为字符串,因此日期和时间应该通过通知传递。不过好像不管用

这里是设置闹钟的代码:

Calendar cal = Calendar.getInstance();
        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
        Intent notificationIntent = new Intent("android.media.action.DISPLAY_NOTIFICATION");
        notificationIntent.addCategory("android.intent.category.DEFAULT");
        PendingIntent broadcast = PendingIntent.getService(context, 100, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        try {
            cal.setTime(alertFormatter.parse(date));
            System.out.print("Date added successfully");
        } catch (ParseException e) {
            System.out.println("Failed to add date");
        }
        cal.add(Calendar.HOUR, Integer.parseInt(hour.getText().toString()));
        cal.add(Calendar.MINUTE, Integer.parseInt(minute.getText().toString()));
        cal.add(Calendar.SECOND, 0);
        if(spAMpm.getSelectedItem().equals("AM"))cal.add(Calendar.AM_PM, Calendar.AM);
        else if (spAMpm.getSelectedItem().equals("PM"))cal.add(Calendar.AM_PM, Calendar.PM);


        alarmManager.setExact(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), broadcast);

然后我创建的接收器来做我需要它做的事情:

public class UpcomingWorkNotification extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {

Intent notificationIntent = new Intent(context, UpcomingWork.class);

TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
stackBuilder.addParentStack(UpcomingWork.class);
stackBuilder.addNextIntent(notificationIntent);

PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);

NotificationCompat.Builder builder =
        new NotificationCompat.Builder(context)
        .setSmallIcon(R.drawable.ic_launcher)
        .setContentTitle("Four.oh")
        .setContentText("Assignment Due Soon!")
        .setContentIntent(pendingIntent);

NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, builder.build());

}
}

在清单中我给了它这个权限并添加了接收者

<uses-permission android:name="android.permission.WAKE_LOCK"/>

<receiver android:name=".UpcomingWorkNotification">
  <action android:name="android.media.action.DISPLAY_NOTIFICATION" />
  <category android:name="android.intent.category.DEFAULT" />
</receiver>

我研究了一段时间,您似乎遇到了一些问题。一是这一行,

PendingIntent broadcast = PendingIntent.getService(context, 100, notificationIntent,
      PendingIntent.FLAG_UPDATE_CURRENT);

您使用 getService(),但后来有一个 BroadcastReceiver。我构建了一个测试设置,如果我这样做了 PendingIntent.getService(),我的 BroadcastReceiver 从未启动过。但是,如果我将其切换为 PendingIntent.getBroadcast(),那么 BroadcastReceiver 就会启动。 PendingIntent.getBroadcast() 采用与 getService().

相同的参数

另一行似乎有问题的是,

Intent notificationIntent = new Intent("android.media.action.DISPLAY_NOTIFICATION");

使用那条线,接收器从未启动。我不得不将其更改为以下内容,

Intent notificationIntent = new Intent(theAppropriateContext, UpcomingWorkNotification.class);

notificationIntent.setAction("android.media.action.DISPLAY_NOTIFICATION");

我使用的一些参考资料,很棒Vogella tutorials, and this previous

在我链接的 SO 答案中,他们似乎通过在清单中使用 intent-filter 来解决问题。但是,我在使用和不使用 intent-filter 的情况下进行了测试,两种情况都有效。虽然像这样放入 intent-filter 可能会更好,

 <receiver android:name=".AlarmNotification">

                <action android:name = "android.media.action.DISPLAY_NOTIFICATION"/>
                <category android:name="android.intent.category.DEFAULT"/>

 </receiver>

编辑:预感之后做了一些额外的测试。当使用 Intent.setAction() 时,它可以在没有 intent-filter 的情况下工作。但是,如果我使用 intent-filter,那么你所拥有的那一行,

Intent notificationIntent = new Intent("android.media.action.DISPLAY_NOTIFICATION");

确实有效。这样做的好处是 Intent.setAction() 需要最低 sdk 版本 19。因此,如果您使用 intent-filter,则可以支持较低的 sdk 版本。