之前在微博看到一个打开手机接收到女朋友消息轰炸的视频,感觉收到了伤害,觉得咱不能落后呀,假的也比没有强,不多掰扯了,进入正题,记录一下Android通知的开发:

Android通知

Android通知(Notification)是Android操作系统中比较特点的一个功能,用于某个应用程序向用户发送提示信息,发送一条信息后,手机状态栏会显示发送通知的应用程序图标,下拉状态栏会显示详细的通知内容,现在所有操作系统都加入了这个功能。
现在的通知主要用于:

  1. 显示接收到短消息、及时消息等信息
  2. 显示客户端的推送消息
  3. 显示正在进行的事物例如:后台运行的程序,如音乐播放进度、下载进度等

通知的组成

一个通知主要有以下几部分组成:

  1. 通知标题。
  2. 大图标。
  3. 通知内容。
  4. 通知消息。
  5. 小图标。
  6. 通知的时间。

    但是因为国内部分对于部分 ROM 对源码进行了修改,对通知的显示进行了更改。

通知的生命周期

Notification 的基本操作主要有创建、更新、取消这三种。一个 Notification 的必要属性有三项,如果不设置则在运行时会抛出异常:

  1. 小图标,通过 setSmallIcon() 方法设置
  2. 标题,通过 setContentTitle() 方法设置
  3. 内容,通过 setContentText() 方法设置

除了以上三项,其它均为可选项。虽然如此,但还是应该给 Notification 设置一个 Action ,这样就可以直接跳转到 App 的某个 Activity 、启动一个 Service 或者发送一个 Broadcast。否则,Notification 仅仅只能起到通知的效果,而不能与用户交互。
当系统接收到通知时,可以通过震动、响铃、呼吸灯等多种方式进行提醒。

构建通知

构建一个通知栏一般分为这几个步骤:
1.创建通知栏管理工具
2.构建通知栏构造器
3.给构造器设置参数
4.发送请求

 //获取NotificationManager实例   NotificationManager notifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);   //实例化NotificationCompat.Builde并设置相关属性   NotificationCompat.Builder builder = new NotificationCompat.Builder(this)           //设置小图标           .setSmallIcon(R.mipmap.icon_fab_repair)           //设置通知标题           .setContentTitle("最简单的Notification")           //设置通知内容           .setContentText("只有小图标、标题、内容")           //设置通知时间,默认为系统发出通知的时间,通常不用设置           //.setWhen(System.currentTimeMillis());   //通过builder.build()方法生成Notification对象,并发送通知,id=1   notifyManager.notify(1, builder.build());

上面的代码适用于Android的低版本,当版本高于8.0(sdk>+26)以后,就会无法弹出通知,因为在8.0中所有通知的实现都需要提供通知渠道,否则,所有通知在8.0系统上面都不能正常显示,原本的方法被遗弃:

需要使用带有通知渠道的方法才行:

通知渠道:

顾名思义,就是每条通知都要属于一个对应的渠道。
每个App都可以自由地创建当前App拥有哪些通知渠道,但是这些通知渠道的控制权都是掌握在用户手上的。用户可以自由地选择这些通知渠道的重要程度,是否响铃、是否振动、或者是否要关闭这个渠道的通知。

对于是否要适配?看下面的解释:
当然,Google也并没有完全做绝,即使方法标为了废弃,但还是可以正常使用的。可是如果你将项目中的targetSdkVersion指定到了26或者更高,那么Android系统就会认为你的App已经做好了8.0系统的适配工作,当然包括了通知栏的适配。这个时候如果还不使用通知渠道的话,那么你的App的通知将完全无法弹出。因此这里给大家的建议就是,一定要适配。by:https://mp.weixin.qq.com/s/PG8XxHEHpijL4AMZ4AGP8g##

创建
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);context=this; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {        String channelId = "chat";      String channelName = "聊天消息"      //通知渠道的重要程度(递减):IMPORTANCE_HIGH、IMPORTANCE_DEFAULT、IMPORTANCE_LOW、IMPORTANCE_MIN,    int importance = NotificationManager.IMPORTANCE_HIGH;           createNotificationChannel(channelId, channelName, importance);       }       Button chat=(Button)findViewById(R.id.chat);       name=(EditText)findViewById(R.id.name);       chat.setOnClickListener(this);   }   @TargetApi(Build.VERSION_CODES.O)   private void createNotificationChannel(String channelId, String channelName, int importance) {       NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);       NotificationManager notificationManager = (NotificationManager) getSystemService(               NOTIFICATION_SERVICE);       notificationManager.createNotificationChannel(channel);   }

第一次运行之后,打开设置,对于应用程序的通知会出现构建好的通知渠道.

所以在新版本中,只需要在建通知是传出通知渠道参数就可以了:

 NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);            Notification notification = new NotificationCompat.Builder(context, "chat")//通知渠道参数                    .setContentTitle("title")                    .setContentText("啦啦啦啦~~~")                    .setWhen(System.currentTimeMillis())                    .setSmallIcon(R.drawable.weixin)                    .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.weixin))                    .setAutoCancel(true)///设置点击通知后自动删除通知                    .build();            manager.notify(code, notification);

更新与移除通知

更新通知很简单,只需要创建一个相同ID的通知就可以覆盖之前的通知,如果之前的通知还未被取消,则会直接更新该通知相关的属性;如果之前的通知已经被取消,则会重新创建一个新通知。

更新通知跟发送通知使用相同的方式

取消通知有如下 5 种方式:

  1. 点击通知栏的清除按钮,会清除所有可清除的通知
  2. 设置了 setAutoCancel() 或 FLAG_AUTO_CANCEL 的通知,点击该通知时会清除它
  3. 通过 NotificationManager 调用 cancel(int id) 方法清除指定 ID 的通知
  4. 通过 NotificationManager 调用 cancel(String tag, int id) 方法清除指定 TAG 和 ID 的通知
  5. 通过 NotificationManager 调用 cancelAll() 方法清除所有该应用之前发送的通知

管理通知渠道

Android赋予了开发者读取通知渠道配置的权限,如果我们的某个功能是必须按照指定要求来配置通知渠道才能使用的,那么就可以提示用户去手动更改通知渠道配置。
如果我们开发的是一个类似于微信的App,聊天消息是至关重要的,如果用户不小心将聊天消息的通知渠道给关闭了,那岂不是所有重要的信息全部都丢了?为此我们一定要保证用户打开了聊天消息的通知渠道才行。

 public void open_inform(View view) {        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {            NotificationChannel channel = manager.getNotificationChannel("IMPORTANCE_HIGH");            if (channel.getImportance() == NotificationManager.IMPORTANCE_NONE) {                Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);                intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName());                intent.putExtra(Settings.EXTRA_CHANNEL_ID, channel.getId());                startActivity(intent);                Toast.makeText(this, "请手动将通知打开", Toast.LENGTH_SHORT).show();            }        }    }

通过getNotificationChannel()方法获取到了NotificationChannel对象,然后就可以读取该通知渠道下的所有配置了。这里我们判断如果通知渠道的importance等于IMPORTANCE_NONE,就说明用户将该渠道的通知给关闭了,这时会跳转到通知的设置界面提醒用户手动打开。

Android 8.0还赋予了我们删除通知渠道的功能,只需使用如下代码即可删除:

 public void delete_inform(View view) {        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {            manager.deleteNotificationChannel("IMPORTANCE_HIGH");        }    }

修饰通知(震动,呼吸灯、提示音以及如何显示)

                .setDefaults(Notification.DEFAULT_ALL)//        这里关键的在于 SetDefaults 这个方法,它接收一个 int,可选值如下://        Notification.DEFAULT_VIBRATE :震动提示//        Notification.DEFAULT_SOUND:提示音//        Notification.DEFAULT_LIGHTS:三色灯//        Notification.DEFAULT_ALL:以上三种全部
控制震动时长

setVibrate 接收一个long[], 下标为奇数为延时,偶数为震动时长,本例中为,延时0ms,震动300ms,延时200ms,震动300

builder.setVibrate(new long[]{0, 300, 200, 300});// Android 8.0 需用以下方法// notificationChannel.enableVibration(true);// notificationChannel.setVibrationPattern(new long[]{0,300,300,500,300,800});
控制灯颜色

三个参数依次是 int ARGB 颜色值、亮的时长、不亮的时长。

builder.setLights(0xFFFF0000, 1000,1000);// Android 8.0 需用以下方法,不可设置时长// notificationChannel.enableLights(true);// notificationChannel.setLightColor(0xFFFF0000);
控制声音

builder.setSound(Uri.parse(“android.resource://” + getPackageName() + “/” + R.raw.a))
// Android 8.0 需用以下方法, 这里用的是加载res/raw的声音资源
// notificationChannel.setSound(Uri.parse(“android.resource://” + getPackageName() + “/” + R.raw.a), null);

在锁屏上的显示方式

这个方法需要使用锁屏并在设置中隐藏敏感信息才能生效

builder.setVisibility(Notification.VISIBILITY_PUBLIC);// Android 8.0 需用一下方法// notificationChannel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);

这个方法接收一个 int

  1. Notification.VISIBILITY_PUBLIC 显示所有通知内容
  2. Notification.VISIBILITY_PRIVATE 只显示标题 Notification.VISIBILITY_SECRET
  3. 不显示任何内容
持续的通知

如播放音乐,后台任务,下载, 当这个方法传入 true 时,表示它是一个持续的通知,用户无法删除它,只能在代码中让通知消失。

builder.setOngoing(true);
显示进度条

在后台处理某个耗时任务时需要使用到进度条, 参数作用依次是 进度条最大值、当前进度、进度是否确定,indeterminate 表示任务的进度是否可以准确获取

builder.setProgress(int max, int progress, boolean indeterminate);

带Action的通知

参考:Android 8.0中各种通知写法汇总

参考:
《第一行代码——第二版》郭霖
一起来学习Android 8.0系统的通知栏适配吧
Android 8.0中各种通知写法汇总

更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. Python list sort方法的具体使用
  3. python list.sort()根据多个关键字排序的方法实现
  4. android上一些方法的区别和用法的注意事项
  5. android实现字体闪烁动画的方法
  6. Android中dispatchDraw分析
  7. Android(安卓)studio3.x 多渠道打包apk
  8. Android四大基本组件介绍与生命周期
  9. Android(安卓)MediaPlayer 常用方法介绍

随机推荐

  1. 使用Beetle.NetPackage简单实现android和
  2. Android豆瓣图书查询Demo
  3. Android构建时报错: java.io.IOException:
  4. Android开发者的Ane简单入门
  5. android底层开发-android基础架构
  6. android开发中常用的五大布局
  7. Android的UI组件之TextView、EditText
  8. Android_传感器综述
  9. Android(安卓)ListView圆角实现
  10. Android使用FFmpeg(二)--Android Studio