Android通知未显示

时间:2019-01-13 15:57:43

标签: android android-notifications

我正在尝试进行每日通知,该通知将在特定时间显示。 不幸的是,它没有显示。

我尝试关注情侣装(也来自developer.android.com),并检查了已经问过的类似问题。为了节省时间,我正在使用Hawk库。

Intent intent = new Intent(getContext(), AlarmReceiver.class);
    int notificationId = 1;
    intent.putExtra("notificationId", notificationId);

PendingIntent alarmIntent = PendingIntent.getBroadcast(getContext(), 0,
            intent,PendingIntent.FLAG_NO_CREATE);

AlarmManager alarm = (AlarmManager)  getContext().getSystemService(getContext().ALARM_SERVICE);


    switch (view.getId()) {
    int hour = timePicker.getCurrentHour();
            int minute = timePicker.getCurrentMinute();

            // Create time
            ....

            //set alarm
            alarm.setRepeating(AlarmManager.RTC_WAKEUP, alarmStartTime, AlarmManager.INTERVAL_DAY, alarmIntent);

            Hawk.put("notification_hour", alarmStartTime);

            break;

        case R.id.cancel_button:
//cancel notification
            break;
    }
}

这里是AlarmReceiver类

public class AlarmReceiver extends BroadcastReceiver {

    public AlarmReceiver () {
    }

    @Override
    public void onReceive(Context context, Intent intent) {

        sendNotification(context, intent);
    }

    private void sendNotification(Context con, Intent intent) {

        int notificationId = intent . getIntExtra ("notificationId", 1);
        String message = " message";

        Intent mainIntent = new Intent(con, MainActivity.class);
        PendingIntent contentIntent = PendingIntent . getActivity (con, 0, mainIntent, 0);

        NotificationManager myNotificationManager =(NotificationManager) con . getSystemService (Context.NOTIFICATION_SERVICE);

        Notification.Builder builder = new Notification.Builder(con);
        builder.setSmallIcon(android.R.drawable.ic_dialog_info)
            .setContentTitle("Reminder")
            .setContentText(message)
            .setWhen(System.currentTimeMillis())
            .setAutoCancel(true)
            .setContentIntent(contentIntent)
            .setPriority(Notification.PRIORITY_MAX)
            .setDefaults(Notification.DEFAULT_ALL);

        myNotificationManager.notify(notificationId, builder.build());
    }
}

1 个答案:

答案 0 :(得分:2)

在OREO中,他们重新设计了通知,以提供一种更轻松,更一致的方式来管理通知行为和设置。其中一些更改包括:

通知渠道:Android 8.0引入了通知渠道,可让您为要显示的每种通知类型创建用户可定制的渠道。 通知点:Android 8.0引入了对在应用启动器图标上显示点或徽章的支持。通知点反映了用户尚未被解雇或采取行动的通知的存在。

延后:用户可以延后通知,这会使它们消失一段时间后再出现。通知以与第一次出现时相同的重要性重新出现。

消息传递样式:在Android 8.0中,使用MessagingStyle类的通知以折叠形式显示更多内容。您应该将MessagingStyle类用于与消息相关的通知。 在这里,我们创建了NotificationHelper类,该类需要使用Context作为构造函数参数。 NOTIFICATION_CHANNEL_ID变量已经初始化,以便将channel_id设置为NotificationChannel。

方法 createNotification(...)需要标题和消息参数,以便设置通知的标题和内容文本。为了处理通知单击事件,我们创建了未完成的对象,该对象重定向到SomeOtherActivity.class。

通知通道使您可以为要显示的每种通知类型创建用户可定制的通道。因此,如果android版本大于或等于8.0,我们必须创建NotificationChannel对象并将其设置为NotificationManager的createNotificationChannel(…)setter属性。

public class NotificationHelper {

private Context mContext;
private NotificationManager mNotificationManager;
private NotificationCompat.Builder mBuilder;
public static final String NOTIFICATION_CHANNEL_ID = "10001";

public NotificationHelper(Context context) {
    mContext = context;
}

/**
 * Create and push the notification 
 */
public void createNotification(String title, String message)
{    
    /**Creates an explicit intent for an Activity in your app**/
    Intent resultIntent = new Intent(mContext , SomeOtherActivity.class);
    resultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    PendingIntent resultPendingIntent = PendingIntent.getActivity(mContext,
            0 /* Request code */, resultIntent,
            PendingIntent.FLAG_UPDATE_CURRENT);

    mBuilder = new NotificationCompat.Builder(mContext);
    mBuilder.setSmallIcon(R.mipmap.ic_launcher);
    mBuilder.setContentTitle(title)
            .setContentText(message)
            .setAutoCancel(false)
            .setSound(Settings.System.DEFAULT_NOTIFICATION_URI)
            .setContentIntent(resultPendingIntent);

    mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O)
    {
        int importance = NotificationManager.IMPORTANCE_HIGH;
        NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "NOTIFICATION_CHANNEL_NAME", importance);
        notificationChannel.enableLights(true);
        notificationChannel.setLightColor(Color.RED);
        notificationChannel.enableVibration(true);
        notificationChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
        assert mNotificationManager != null;
        mBuilder.setChannelId(NOTIFICATION_CHANNEL_ID);
        mNotificationManager.createNotificationChannel(notificationChannel);
    }
    assert mNotificationManager != null;
    mNotificationManager.notify(0 /* Request Code */, mBuilder.build());
}

只需包含一个NotificationChannel并为其设置一个频道ID。