十一、notification笔记


  1. 发出通知
    1
    2
    3
    val destUri = Uri.parse("cloudeye://warning/json={\"data\":{\"warningId\":\"df68dea17f74412da60490333f8f5ed7\",\"type\":\"eventWarning\"},\"code\":0,\"msg\":\"登录成功\"}")	 
    val notification = NotificationUtils.buildPushNotification(this, "Hello_world", Intent(Intent.ACTION_VIEW, destUri), true)
    NotificationManagerCompat.from(this).notify(NotificationId.getId(), notification)

注意 NotificationManagerCompat的 notify 方法第一个参数为int类型的id,每一个id对应通知栏的一条通知。所以如果这里写死id的话,你接收到的通知会覆盖掉上一条,导致通知栏只保留一条通知。
为了能显示多条通知,这里的id得不能重复(Generate int unique id as android notification id)。生成id代码如下

NotificationId.kt

1
2
3
4
5
6
object NotificationId {
private val c = AtomicInteger(0)
fun getId(): Int {
return c.incrementAndGet()
}
}

  1. 发送一个简单的通知
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public void sendSimpleNotification(Context context) {
    NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
    //设置内容
    builder.setContentTitle("简单的通知的标题")
    //设置内容
    .setContentText("这是通知内容")
    //大图标
    .setLargeIcon(BitmapFactory.decodeResource(
    context.getResources(), R.mipmap.ic_launcher))
    //设置小图标背景色(默认不设置)
    .setColor(0xffff0000)
    //设置这个标志当用户单击面板就可以让通知将自动取消
    .setAutoCancel(true)
    //小图标
    .setSmallIcon(R.mipmap.ic_launcher);
    //通知管理器
    NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context);
    //通知Id 一个id对应一个单独的通知栏
    int id = ID_SIMPLE;
    //发送通知
    managerCompat.notify(id, builder.build());
    }


  1. 有提醒的通知(声音/振动/闪光灯)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public void sendRemindNotification(Context context){
    NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
    builder
    .setContentTitle("下雨了")
    .setContentText("家里的衣服收了吗?")
    .setSmallIcon(R.mipmap.ic_launcher)
    //声音
    .setSound(Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.remind))
    //振动 振500 停500 再振500
    .setVibrate(new long[]{0, 500, 500, 500})
    //灯光 亮200 灭100
    .setLights(Color.BLUE, 200, 100);
    //也可以全部设置 (灯光 声音 振动)
    //.setDefaults(NotificationCompat.DEFAULT_ALL)
    NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context);
    managerCompat.notify(ID_REMIND, builder.build());
    }


  1. 有响应事件的通知
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public void sendOnClickNotification(Context context) {
    NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
    builder
    .setContentTitle("新的邮件")
    .setContentText("尊敬的用户:为回馈老用户....")
    .setSmallIcon(R.mipmap.ic_launcher)
    //点击跳转的意图
    .setContentIntent(responseActivityIntent(context, "查看邮寄"));
    NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context);
    managerCompat.notify(ID_ONCLICK, builder.build());
    }
    //响应开启一个服务的意图
    private PendingIntent responseServiceIntent(Context context, int action, String desc) {
    Intent intent = new Intent(context, ResponseService.class);
    intent.putExtra(ResponseService.EXTRA_ACTION, action);
    intent.putExtra(ResponseService.EXTRA_DESC, desc);
    //设置一个action防止PendingIntent被复用 导致数据错乱
    intent.setAction("Service_Intent_Action_" + action);
    return PendingIntent.getService(context, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    }


  1. 有按钮的通知
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    public void sendOnButtonNotification(Context context) {
    NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
    builder
    .setContentTitle("新的好友")
    .setContentText("隔壁老王添加你为好友?")
    .setSmallIcon(R.mipmap.ic_launcher)
    //添加操作 点击跳转的意图
    .addAction(R.mipmap.ic_launcher, "接受", responseServiceIntent(context, ResponseService.ACTION_ACCEPT, "点击了接收"))
    .addAction(R.mipmap.ic_launcher, "拒绝", responseServiceIntent(context, ResponseService.ACTION_CANCEL, "点击了拒绝"))
    //点击跳转的意图
    .setContentIntent(responseActivityIntent(context, "处理老王的好友请求"));
    NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context);
    managerCompat.notify(ID_ONBUTTON, builder.build());
    }

    //响应开启一个活动的意图
    private PendingIntent responseActivityIntent(Context context, String desc) {
    Intent intent = new Intent(context, ResponseActivity.class);
    //设置一个action防止PendingIntent被复用 导致数据错乱
    intent.setAction("Activity_Intent_Action_" + desc);
    intent.putExtra(ResponseActivity.EXTRA_DESC, desc);
    //启动activity的不是activity 就需要加这个
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    }


  1. 有进度条的通知
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
    builder
    .setContentTitle("文件名")
    .setContentText("下载进度描述/进度等")
    .setSmallIcon(R.mipmap.ic_launcher)
    //indeterminate 模糊的进度显示
    .setProgress(100,50,true)
    //点击跳转的意图
    .setContentIntent(responseActivityIntent(context, "处理下载任务"));
    NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context);
    managerCompat.notify(ID_ONBUTTON, builder.build());


  1. 清除通知
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //1.设置自动管理通知
    NotificationCompat.Builder.setAutoCancel(true);
    //2.动态清除
    NotificationManagerCompat notifyMg = NotificationManagerCompat.from(context);
    //取消 TAG ID 相应的通知
    notifyMg.cancel(TAG_TEST,id);
    //3.右滑划掉 点击清除
    //4.保持通知不被移除
    NotificationCompat.Builder.setOngoing(true);


8.锁屏显示控制

1
2
3
4
//1设置在锁屏页面显示
NotificationCompat.Builder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
//2设置锁屏上显示的时候 可以自定义在锁屏上的通知栏
NotificationCompat.Builder.setPublicVersion(null)

  1. 自定义通知栏
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public void sendCustomNotification(Context context) {
    NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
    RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.layout_custom_notification);
    remoteViews.setTextViewText(R.id.tv_content, "自定义内容");
    remoteViews.setImageViewResource(R.id.iv_close, R.mipmap.ic_launcher);
    remoteViews.setOnClickPendingIntent(R.id.iv_close, responseActivityIntent(context, "close"));
    builder.setContent(remoteViews).setSmallIcon(R.mipmap.ic_launcher);
    NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context);
    managerCompat.notify(TAG_TEST, ID_CUSTOM, builder.build());
    }