安卓8.0通知栏适配

2024-09-06 07:48
文章标签 安卓 8.0 通知 适配

本文主要是介绍安卓8.0通知栏适配,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、谷歌为什么在安卓8.0对通知栏进行修改

        系统通知栏作为除桌面启动图标之外的唯一入口,对app的日活起到非常重要的作用,因此各个app开发商都希望能抢占用户的通知栏。随着移动端的普及和安卓手机存储容量的扩大,用户手机能安装的app数量越来越多,一台手机安装几十到上百个app已经不足为奇,各个app都极尽可能的抢占通知栏,而安卓系统本身又没有一种规范来约束app开发商的这种行为,导致用户越来越讨厌 通知栏里的通知。 
        比如你早上刚醒来,点亮手机屏幕,发现通知栏有几十条通知,而绝大多数通知都是垃圾信息。这时你一定头皮发麻,通知栏 一堆乱七八糟的通知,根本不知道应该点开哪个通知, 这种通知行为不是用户的主动操作,而是被动的接收,其本质是对用户的一种打扰。 另外,手机后台接收推送本身也会消耗一定的资源,如电量、流量、内存等,导致手机经常很卡,需要用户频繁点“内存清理”。
        谷歌意识到这个问题,那么如何解决呢?直接废弃通知栏吗? 当然也不合适,毕竟有些消息是用户真正关心的,比如支付宝收款通知、银行app入帐通知(嘿嘿,原谅我眼里只有钱,因为我很穷)。
        谷歌想到的办法是,如果系统能区分这些消息的分类,并把不同分类消息的通知栏弹出的权限交给用户,那么用户就可以设置为 只对自己感兴趣的通知弹出通知栏。比如只允许弱 支付宝收款通知,而不弹 支付宝投资广告等通知。  因此, 谷歌在android 8.0中就加入了此特性。

二、android 8.0 通知栏 渠道的概念

        android官网对 通知栏渠道  的解析,可以参见官网链接   (注意此链接需要梯子) 
        https://developer.android.com/about/versions/oreo/android-8.0
        android 8.0 中允许app开发者 针对自己的 app的 所有通知栏通知 设定分组,系统会将这些分组的通知栏权限 交给用户自己去设定,并且 用户可以自由地选择这些通知渠道的重要程度,是否响铃、是否振动、或者是否要关闭这个渠道的通知。

以下特性摘自android官网
    在 Android 8.0 中,我们已重新设计通知,以便为管理通知行为和设置提供更轻松和更统一的方式。这些变更包括:

 

  • 通知渠道:Android 8.0 引入了通知渠道,其允许您为要显示的每种通知类型创建用户可自定义的渠道。用户界面将通知渠道称之为通知类别。要了解如何实现通知渠道的信息,请参阅通知渠道指南。
  • 通知标志:Android 8.0 引入了对在应用启动器图标上显示通知标志的支持。通知标志可反映某个应用是否存在与其关联、并且用户尚未予以清除也未对其采取行动的通知。通知标志也称为通知点。要了解如何调整通知标志,请参阅通知标志指南。
  • 休眠:用户可以将通知置于休眠状态,以便稍后重新显示它。重新显示时通知的重要程度与首次显示时相同。应用可以移除或更新已休眠的通知,但更新休眠的通知并不会使其重新显示。
  • 通知超时:现在,使用 setTimeoutAfter() 创建通知时您可以设置超时。您可以使用此函数指定一个持续时间,超过该持续时间后,通知应取消。如果需要,您可以在指定的超时持续时间之前取消通知。
  • 通知设置:当您使用 Notification.INTENT_CATEGORY_NOTIFICATION_PREFERENCESIntent 从通知创建指向应用通知设置的链接时,您可以调用 setSettingsText() 来设置要显示的文本。此系统可以提供以下 Extra 数据和 Intent,用于过滤应用必须向用户显示的设置:EXTRA_CHANNEL_IDNOTIFICATION_TAG 和 NOTIFICATION_ID
  • 通知清除:系统现在可区分通知是由用户清除,还是由应用移除。要查看清除通知的方式,您应实现 NotificationListenerService 类的新 onNotificationRemoved() 函数。
  • 背景颜色:您现在可以设置和启用通知的背景颜色。只能在用户必须一眼就能看到的持续任务的通知中使用此功能。例如,您可以为与驾车路线或正在进行的通话有关的通知设置背景颜色。您还可以使用 Notification.Builder.setColor() 设置所需的背景颜色。这样做将允许您使用 Notification.Builder.setColorized() 启用通知的背景颜色设置。
  • 消息样式:现在,使用 MessagingStyle 类的通知可在其折叠形式中显示更多内容。对于与消息有关的通知,您应使用 MessagingStyle 类。您还可以使用新的 addHistoricMessage() 函数,通过向与消息相关的通知添加历史消息为会话提供上下文。

三、我们app必须适配吗?

        这里我给出明确的回复是:app必须对8.0的通知进行适配,不论你app的targetSdkVersion设置成多少。
        这里有些网友可能会想起android 6.0适配动态权限那一套机制,但经过我实际测试,发现8.0通知栏适配并不是我们想像的那样。谷歌对新特性的推广,态度已经非常强硬了,不像以前6.0适配动态权限时那样,允许你通过targetSdkVersion来暂时逃避此问题,因为google发现这种做法就是 纵容、溺爱,并且严重影响 android系统的更新推广速度。

       1、在android 8.0 的 模拟器中,可以通过设置 targetSdkVersion 低于 8.0 来逃避此特性,这样你的app运行在  android 8.0 上仍然能正常弹出通知
       2.   在部分基于 android 8.0的 第三方rom中,如 三星s9、小米mix2s ,这两部手机的rom都是基于andrid 8.0,但实测发现,targetSdk=6.0时,原来没有 channelId 的方式,在这两部手机上不能正常弹出通知

      结论: 开发者最好对app内的通知做好分类,并在代码中为所有分类创建好通知渠道。  偷懒的可以不做分类,但必须创建好通知渠道,以便app运行在android 8.0上能正常弹出通知。

四、如何适配?       

       第一步,创建通知栏渠道

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {NotificationManager mNotificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);//只在Android O之上需要渠道NotificationChannel notificationChannel = new NotificationChannel("100","后台录轨迹的通知", NotificationManager.IMPORTANCE_HIGH);mNotificationManager.createNotificationChannel(notificationChannel);}

        第二步,在构建Notification通知时,传入渠道号id

NotificationCompat.Builder builder = new NotificationCompat.Builder(this, "100");

     注意: 当你的 support 包的版本 大于等于26时,不传channelId的 Builder 构造函数已经被标记为废弃了。 如下图:

        第三步,当判断到用户关闭了通知权限时,app可以在适当的时机提示用户打开此类消息的权限
 

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {NotificationChannel channel = manager.getNotificationChannel("chat");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();}}


五、如何对通知进行分类

        但如何对app的通知进行分类,google把这个决定权交给了app的设计者,在国内通常是 产品经理——程序猿最讨厌的角色之一。因为产品经理通常不懂技术,更不会关注自己产品的所运行的平台的新特性。
        那么程序猿就需要扛起兼容适配这种 吃力不讨好的工作,说吃力是因为 安卓碎片化 确实让开发者很头疼;说不讨好呢,是因为这种工作通常在产品经理眼里,是你程序猿技术不行,开发的app不是这里有问题 就是那里有问题。   程序猿如何避免这种坑呢,那就好好来阅读我这篇文章,并运用到实践中吧!
       

 

 

这篇关于安卓8.0通知栏适配的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1141426

相关文章

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法

消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法   消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法 [转载]原地址:http://blog.csdn.net/x605940745/article/details/17911115 消除SDK更新时的“

安卓玩机工具------小米工具箱扩展工具 小米机型功能拓展

小米工具箱扩展版                     小米工具箱扩展版 iO_Box_Mi_Ext是由@晨钟酱开发的一款适用于小米(MIUI)、多亲(2、2Pro)、多看(多看电纸书)的多功能工具箱。该工具所有功能均可以免root实现,使用前,请打开开发者选项中的“USB调试”  功能特点 【小米工具箱】 1:冻结MIUI全家桶,隐藏状态栏图标,修改下拉通知栏图块数量;冻结

Linux 删除 当前下的 mysql-8.0.31 空文件夹

在Linux中,如果你想要删除当前目录下的名为mysql-8.0.31的空文件夹(即该文件夹内没有任何文件或子文件夹),你可以使用rmdir命令。但是,如果mysql-8.0.31文件夹并非完全为空(即它包含文件或子文件夹),rmdir命令会失败。 如果你的目标是删除mysql-8.0.31文件夹及其内部的所有内容(无论是否为空),你应该使用rm命令结合-r(或-R,它们是等价的)选项来递归地删

鸿蒙开发5.0【Picker的受限权限适配方案】

Picker由系统独立进程实现,应用可以通过拉起Picker组件,用户在Picker上选择对应的资源(如图片、文档等),应用可以获取Picker返回的结果。 类型受限权限使用的picker音频ohos.permission.READ_AUDIO,ohos.permission.WRITE_AUDIOAudioViewPicker文件ohos.permission.READ_DOCUMENT,oh

安卓开发板_联发科MTK开发评估套件串口调试

串口调试 如果正在进行lk(little kernel ) 或内核开发,USB 串口适配器( USB 转串口 TTL 适配器的简称)对于检查系统启动日志非常有用,特别是在没有图形桌面显示的情况下。 1.选购适配器 常用的许多 USB 转串口的适配器,按芯片来分,有以下几种: CH340PL2303CP2104FT232 一般来说,采用 CH340 芯片的适配器,性能比较稳定,价

mysql数据库8.0小版本原地升级

mysql数据库8.0小版本原地升级 准备工作升级工作停库使用新版本软件启动数据库更新环境变量重启数据库 升级日志 OS release: CentOS 7.9升级前DB version: MySQL 8.0.30数据库升级安装包:mysql-8.0.36-linux-glibc2.12-x86_64.tar.xzMySQL Shell安装包:mysql-shell-8.0.36

安卓实现弹出软键盘屏幕自适应调整

今天,我通过尝试诸多方法,最终实现了软键盘弹出屏幕的自适应。      其实,一开始我想通过EditText的事件来实现,后来发现,安卓自带的函数十分强大,只需几行代码,便可实现。实现如下:     在Manifest中设置activity的属性:android:windowSoftInputMode="adjustUnspecified|stateHidden|adjustResi

AOP之执行前通知@Before

Spring AOP之执行前通知@Before 此文章说一下执行前通知,即注解@Before。 作用 多用于日志记录、权限校验、初始化资源等。 触发时间 目标函数执行触发。 定义 public class AopBeforeAspect {@Before("execution(public * com.example.demo.service.impl.AccountServiceI