问题描述:

项目的告诉栏的RemoteViews布景图有些厂商色彩不对,需求一个适配计划,来适配一切机型。

项目现状:

目前的计划是,创建一个新的告诉,经过这个告诉来获取底色。

Android通知栏适配调研-放弃RemoteViews

其间有一个字段是获取是否是暗黑形式,这段代码是先用按位或疏忽掉通明度,体系的字体色彩不会有特别高的同名度,所以这儿理论上没什么问题,然后核算两个三维向量的间隔,间隔越近,色彩越接近。

Android通知栏适配调研-放弃RemoteViews

这儿是有误差的,目标向量间隔灰色向量rgb(127.5,127.5,127.5)的最大值约为220,而不是180,就会造成纯白色rgb(255,2555,255)的标题字体色彩,理应是黑色布景才干看到,但却被识别成非暗黑形式。

Android通知栏适配调研-放弃RemoteViews

误判了暗黑形式,这儿的布景就色彩就会出问题了。

Android通知栏适配调研-放弃RemoteViews

目前项目的解决计划是经过设置RemoteViews的background色彩去做,这儿需求适配的问题由RemoteViews实现机制发生:RemoteViews被规划具有跨进程通信的特点,经过Binder传递到SystemService进程,根据它的包名来拿相应的运用的资源,为了提高功率,体系没有直接经过Binder去支持一切的View和View操作,那这儿对一般view收效的xml特点,很有可能厂商对体系修正源码后没有完全的适配,可能就不能对其全部收效。

比如对android:background特点进行设置在部分机型上就不会收效,但下面这段代码能够。

RemoteView?.setInt(R.id.ll_root, "setBackgroundColor", ContextCompat.getColor(context, R.color.color_367AF6))

接下来来看项目如何设置色彩。

Android通知栏适配调研-放弃RemoteViews

然后来看拿到暗黑形式的布尔字段后,会设置为#FFFFFFFF/#00000000这两个色彩,这两个色彩都是有问题的,首要暗黑形式情况下,#00000000(百分百通明的黑色)纷歧定会正确解析为通明色,类似问题为启动icon解析时,通明色解析为黑色布景,具体还要调查各厂商体系对源码的修正。

Android通知栏适配调研-放弃RemoteViews

#FFFFFFFF这个色彩也是不对的,不是每个告诉栏的布景都是白色,并且这个色彩也纷歧定会作为布景色,下面鸿蒙体系上就没有收效为白色。

Android通知栏适配调研-放弃RemoteViews

来调查下不一起期的告诉样式,能够发现不是每个时期都是固定色彩底色,有白有黑有灰,那就要动态的获取布景色来设置RemoteVies的布景色,下图以安卓1-7为示例。

Android通知栏适配调研-放弃RemoteViews

接着还要考虑不同的体系版别对Notification的改动,如安卓8.0以上加入了Channel这一特性,项目的告诉最后是要有一步渠道查看的。这儿或许要额定对安卓13的有权限上的适配。

Android通知栏适配调研-放弃RemoteViews

一起假如要考虑告诉栏高度的问题的话,以安卓12为例,自定义告诉的显示区域比安卓11有调整,折叠态高度上限为64dp,打开时高度上限为256dp,且体系强制显示告诉的小图标。所以要考虑到ui层面临高度是否有要求,再来适配各个版别的RemoteViews的高度。下图为打开时示例。

Android通知栏适配调研-放弃RemoteViews

以上,这个计划做不到合适一切机型,要适配一切机型确实是不是个简略的工作。

测验进程:

核心问题为RemoteViews的布景色不能完美适配一切厂商。首要原安卓体系(非厂商自定义)不需求对其有特定的设置,自动跟从主题色彩;厂商自定义安卓体系,则各不相同,如小米则不会自动更改RemoteViews的色彩。

首要测验获取布景色,我开端的测验方法是沿用之前的方法,即build一个Notification,经过遍历其间的text,发现不是一切的都能拿到,参考其他文章列出的类似的表格如下:

Android通知栏适配调研-放弃RemoteViews

项目目前的计划是,假如没拿到字体,默许就是字体为黑色,这个方法安卓7.0之后就失效了。安卓7.0+修正了Notification,选用 @android:color/primary_text_dark现已获取不到色彩值了。

那已然不能完美解决,这儿我运用反编译东西,调查各厂商的逆向工程(以小米为例),这儿需求花费很多的时刻来阅读源码(前公司的代码真的看不懂= =),最后看到其他文章给出一个计划是在manifest加上这一句才会收效。

<item name="android:forceDarkAllowed" tools:targetApi="q">false</item>

以上,RemoteViews的确拥有高自定义ui的特性,但很难找到一个计划来适配一切国内厂商的机型,因为Google规划告诉栏,或者说其他任何的体系组件的伊始就没考虑过自定以rom的因素。

Android通知栏适配调研-放弃RemoteViews

解决计划:

1. 不运用RemoteViews,改用其他计划解决

2. 运用RemoteViews

先说第一个,假如仅仅是目前的告诉栏用途的话,确实没有运用杂乱ui,运用RemoteViews的收益如同不足以掩盖bug多这个缺陷。直播间的告诉栏提醒完全能够用addAction方法来代替:

Android通知栏适配调研-放弃RemoteViews

其他简略场景的情况下:

Android通知栏适配调研-放弃RemoteViews

第二个,假如坚持运用RemoteViews,基本上网络上大部分的相关的文章我都翻过了,我也没看到业界更好的方法,大约只能反编译去看看抖音和微信是怎样做的吧。