【问题标题】:Multiple Notifications, only the first one fires up多个通知,只有第一个触发
【发布时间】:2016-07-14 16:38:39
【问题描述】:

我正在制作一个考勤跟踪系统。 所以,我需要在上课前和上课后发出通知。

主要方法是我从数据库中为每门课程创建通知的地方。

mainMethod() {
    testAlarmA(s[0], s[2]);
    testAlarmB(s[0], s[2]);
}

我已经为每个意图实现了 setAction() 方法,并且对于每个待处理的意图也有不同的请求代码(我已经在本网站的早期问题中阅读了这些)

private void testAlarmA (String code) {
    Log.i("attendance", "class-start");
    AlarmManager alarmManager = (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE);

    Intent notificationIntent = new Intent("android.media.action.DISPLAY_ATTENDANCE_NOTIFICATION");
    notificationIntent.addCategory("android.intent.category.DEFAULT");
    notificationIntent.putExtra("type", "start");
    notificationIntent.putExtra("courseCode", code);
notificationIntent.setAction(Long.toString(System.currentTimeMillis()));

    Calendar c = Calendar.getInstance();
    c.add(Calendar.MINUTE, 1);

    PendingIntent broadcast = PendingIntent.getBroadcast(getContext(), 111, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), (2 * 60 * 1000), broadcast);
}

private void testAlarmB (String code){
    Log.i("attendance", "class-end");
    AlarmManager alarmManager = (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE);

    Intent notificationIntent = new Intent("android.media.action.DISPLAY_ATTENDANCE_NOTIFICATION");
    notificationIntent.addCategory("android.intent.category.DEFAULT");
    notificationIntent.putExtra("type", "end");
    notificationIntent.putExtra("courseCode", code);
    notificationIntent.setAction(Long.toString(System.currentTimeMillis()));

    Calendar c = Calendar.getInstance();
    c.add(Calendar.MINUTE, 2);

    PendingIntent broadcast = PendingIntent.getBroadcast(getContext(), 222, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), (2 * 60 * 1000), broadcast);

}

在广播接收器类中,我正在提取额外信息以知道要触发哪个通知,即类开始或结束。

但只有类开始通知是接收者,类结束日志条目从不显示。

@Override
public void onReceive(Context context, Intent intent) {
    Log.i("time", "onReceive");
    mNotificationManager =
            (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    manager = mNotificationManager;

        if (intent.getExtras().containsKey("type")) {
            Log.i("time", "containsKey");

            String type = intent.getExtras().getString("type");
            if (type.equals("end")) {
                Log.i("time", "end");
                endNotif(context);

            } else if (type.equals("start")) {
                Log.i("time", "start");
                startNotif(context);

            } 
     }

}

我还有通知生成器的用户唯一 ID。

private void startNotif (Context context) {
    Intent notificationIntent = new Intent();
    notificationIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context)
            .setContentTitle("You Have " + courseCode + " at " + roomNo)
            .setContentIntent(pendingIntent)
            .setDefaults(Notification.DEFAULT_VIBRATE)
            .setPriority(Notification.PRIORITY_DEFAULT)
            .setVisibility(Notification.VISIBILITY_PUBLIC)
            .setSmallIcon(R.drawable.ic_library_books_white_24dp)
            .setLights(0xff00ff00, 1000, 1000)
            .setAutoCancel(true);

    mNotificationManager.notify(1, mBuilder.build());
}

我的结束类通知将有 3 个不同的操作按钮。

private void endNotif (Context context) {
    Intent notificationIntent = new Intent(context, AttendanceActivity.class);
    notificationIntent.putExtra("courseCode", courseCode);
    notificationIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

    Intent classAttended = new Intent(context, AttendanceNotificationServiceClass.class);
    classAttended.setAction("action");
    classAttended.putExtra("courseCode", courseCode);
    classAttended.putExtra("class", "attended");
    PendingIntent pClassAttended = PendingIntent.getService(context, 11, classAttended, PendingIntent.FLAG_UPDATE_CURRENT);

    Intent classBunked = new Intent(context, AttendanceNotificationServiceClass.class);
    classBunked.setAction("action");
    classBunked.putExtra("courseCode", courseCode);
    classBunked.putExtra("class", "bunked");
    PendingIntent pClassBunked = PendingIntent.getService(context, 22, classBunked, PendingIntent.FLAG_UPDATE_CURRENT);

    Intent classOff = new Intent(context, AttendanceNotificationServiceClass.class);
    classOff.setAction("action");
    classOff.putExtra("courseCode", courseCode);
    classOff.putExtra("class", "off");
    PendingIntent pClassOff = PendingIntent.getService(context, 33, classOff, PendingIntent.FLAG_UPDATE_CURRENT);

    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context)
            .setVisibility(Notification.VISIBILITY_PUBLIC)
            .setSmallIcon(R.drawable.ic_library_books_white_24dp)
            .setContentTitle(courseCode + " Just Ended")
            .setContentText("Did you attend " + courseCode + " ?")
            .addAction(R.drawable.ic_thumb_up_white_24dp, "Attended", pClassAttended)
            .addAction(R.drawable.ic_thumb_down_white_24dp, "Bucked", pClassBunked)
            .addAction(R.drawable.ic_clear_white_24dp, "Class Off", pClassOff)
            .setContentIntent(pendingIntent)
            .setDefaults(Notification.DEFAULT_VIBRATE)
            .setPriority(Notification.PRIORITY_HIGH)
            .setLights(0xff00ff00, 1000, 1000)
            .setAutoCancel(true);

    mNotificationManager.notify(0, mBuilder.build());   
}

但是当我启动应用程序时,1 分钟后只显示开课通知。课程结束通知应该在课程开始通知后 1 分钟显示。

开始通知按应有的方式显示,即每分钟之后。 但是从不显示结束通知,甚至一次也没有。

如果在 testAlarmA() 和 testAlarmB() 方法中,我进行了更改,以便在 testAlarmA() 之前触发 testAlarmB(),则只会显示 B/end。永远不会显示 A/start。

我的日志

07-14 22:04:49.258 30137-30137/in.ac.iitd.bsw.iitdapp I/time: onReceive
07-14 22:04:49.286 30137-30137/in.ac.iitd.bsw.iitdapp I/time: containsKey
07-14 22:04:49.287 30137-30137/in.ac.iitd.bsw.iitdapp I/time: start
07-14 22:06:29.165 30137-30137/in.ac.iitd.bsw.iitdapp I/time: onReceive
07-14 22:06:29.173 30137-30137/in.ac.iitd.bsw.iitdapp I/time: containsKey
07-14 22:06:29.173 30137-30137/in.ac.iitd.bsw.iitdapp I/time: start
07-14 22:07:59.689 30137-30137/in.ac.iitd.bsw.iitdapp I/time: onReceive
07-14 22:07:59.690 30137-30137/in.ac.iitd.bsw.iitdapp I/time: containsKey
07-14 22:07:59.690 30137-30137/in.ac.iitd.bsw.iitdapp I/time: start
07-14 22:09:52.756 30137-30143/in.ac.iitd.bsw.iitdapp W/art: Suspending all threads took: 5.590ms
07-14 22:10:29.623 30137-30137/in.ac.iitd.bsw.iitdapp I/time: onReceive
07-14 22:10:29.624 30137-30137/in.ac.iitd.bsw.iitdapp I/time: containsKey
07-14 22:10:29.624 30137-30137/in.ac.iitd.bsw.iitdapp I/time: start
07-14 22:11:59.696 30137-30137/in.ac.iitd.bsw.iitdapp I/time: onReceive
07-14 22:11:59.696 30137-30137/in.ac.iitd.bsw.iitdapp I/time: containsKey
07-14 22:11:59.696 30137-30137/in.ac.iitd.bsw.iitdapp I/time: start
07-14 22:13:23.618 30137-30137/in.ac.iitd.bsw.iitdapp I/time: onReceive
07-14 22:13:23.618 30137-30137/in.ac.iitd.bsw.iitdapp I/time: containsKey
07-14 22:13:23.657 30137-30137/in.ac.iitd.bsw.iitdapp I/time: start
07-14 22:15:43.136 30137-30137/in.ac.iitd.bsw.iitdapp I/time: onReceive
07-14 22:15:43.136 30137-30137/in.ac.iitd.bsw.iitdapp I/time: containsKey
07-14 22:15:43.136 30137-30137/in.ac.iitd.bsw.iitdapp I/time: start

【问题讨论】:

    标签: android android-intent notifications android-alarms


    【解决方案1】:

    在 testAlarmA 和 testAlarmB 方法中,您使用的是 Intent 构造函数,即设置动作,无需再次调用 setAction。在 setAction 方法中,您传递的是 Long.toString(System.currentTimeMillis()),我认为您错误地插入了它,请尝试删除它。

    查看此意图构造函数: https://developer.android.com/reference/android/content/Intent.html#Intent(java.lang.String)

    和 setAction 方法: https://developer.android.com/reference/android/content/Intent.html#setAction(java.lang.String)

    【讨论】:

    • 我在setAction()中使用了Long.toString(System.currentTimeMillis()),因为我在stackOverflow上读到每个意图都应该有不同且唯一的setAction-ID,并且由于每个动作的系统时间总是唯一的,因此我用过。
    • 我也试过没有setAction(),结果还是一样。谢谢回复
    【解决方案2】:

    嗨,当创建 pendingIntent 对象时,请确保每个 Intent 具有不同的通知 ID,如下所示

    PendingIntent deletePendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), notificationId, deleteIntent, 0);
    

    notificationId 是在打开应用时需要传递一个,启动后需要另一个

    【讨论】:

    • 是的,我知道这一事实,如您所见,我对每个待处理的 Intent 都有不同的 ID,即第一个和第二个分别为 111 和 222。 PendingIntent broadcast = PendingIntent.getBroadcast(getContext(), 111, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); PendingIntent broadcast = PendingIntent.getBroadcast(getContext(), 222, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 谢谢回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多