Android8.0使用Notification的一些问题总结

Android8.0使用Notification的一些问题总结

文章目录

  • Android8.0使用Notification的一些问题总结
      • Android8.0使用Notification
      • 悬浮通知不显示,只有状态栏有
      • getActivity的Intent数据不更新


Android8.0使用Notification

添加Notification的基本步骤一般是:配置Notification.Builder->获取状态栏通知管理->NotificationManager->绑定Notification,发送通知请求。

要使得APP能在Android8.0中显示通知,需要进行版本判断,然后给builder设置Channel:

//判断是否是8.0Android.O
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    NotificationChannel chan1 = new NotificationChannel("static", "Primary Channel", NotificationManager.IMPORTANCE_HIGH);
    manager.createNotificationChannel(chan1);
    builder = new NotificationCompat.Builder(context, "static");
} else {
    builder = new NotificationCompat.Builder(context);
}

同时发送静态广播(sendBroadcast)之前要设置Component:

intentBroadcast.setComponent(new ComponentName(getPackageName(), getPackageName() + ".xxxReceiver"));

具体代码为:

private void sendStaticBroadcast() {
    Intent intentBroadcast = new Intent(STATICACTION);
    intentBroadcast.setComponent(new ComponentName(getPackageName(), getPackageName() + ".StaticReceiver"));
    sendBroadcast(intentBroadcast);
}
public class StaticReceiver extends BroadcastReceiver {
    public static final String STATICACTION = "com.example.xxx.xxx.MyStaticFilter";
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(STATICACTION)){
            //获取状态通知栏管理
            NotificationManager manager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
            NotificationCompat.Builder builder;
            //判断是否是8.0Android.O
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                NotificationChannel chan1 = new NotificationChannel("static",
                        "Primary Channel", NotificationManager.IMPORTANCE_HIGH);
                manager.createNotificationChannel(chan1);
                builder = new NotificationCompat.Builder(context, "static");
            } else {
                builder = new NotificationCompat.Builder(context);
            }
            //对builder进行配置
            builder.setContentTitle("xxx") //设置通知栏标题
                    .setContentText("xxx") //设置通知栏显示内容
                    .setPriority(NotificationCompat.PRIORITY_MAX) //设置通知优先级
                    .setSmallIcon(R.mipmap.empty_star)
                    .setDefaults(DEFAULT_ALL)
                    .setAutoCancel(true); //设置这个标志当用户单击面板就可以将通知取消
            //绑定intent,点击图标能够进入某activity
            Intent mIntent=new Intent(context, DetailActivity.class);
            mIntent.putExtras(bundle);
            PendingIntent mPendingIntent=PendingIntent.getActivity(context, 0, mIntent,PendingIntent.FLAG_UPDATE_CURRENT);
            builder.setContentIntent(mPendingIntent);
            //绑定Notification,发送通知请求
            manager.notify(0, builder.build());
        }
    }
}

悬浮通知不显示,只有状态栏有

  1. 首先需要打开手机设置查看通知相关的权限(横幅)是否打开
  2. 对于Android8.0以下的手机,需要在设置builder时加入以下代码:
//NotificationCompat.Builder builder
builder.setPriority(NotificationCompat.PRIORITY_MAX)
builder.setDefaults(DEFAULT_ALL)
  1. 对于Android8.0以上的手机,需要在建立Channel时设置优先级为HIGH:
NotificationChannel chan1 = new NotificationChannel("dynamic", "Primary Channel", NotificationManager.IMPORTANCE_HIGH);
  1. 如果在改了代码之后还是不显示,卸载APP重装即可

getActivity的Intent数据不更新

有时候我们会发现在使用PendingIntent.getActivity(context, 0, intent, 0);时,尽管把不同的intent值赋值进去了,但是之后点击通知发现intent值并没有改变,还是原来的值。
这与getActivity(Context context, int requestCode, Intent intent, int flags)函数的第4个参数有关,需要修改成:

PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

你可能感兴趣的:(Android)