安卓AppWidget桌面小组件在国产移动设备的一些适配问题
前言
安卓AppWidget推出比较早,但似乎用的人并不多,也没有掀起什么使用潮流,不过近期公司要求做,所以去尝试接入使用,不过遇到一些坑的地方,所以想归纳一下问题。
关于如何使用小组件appWidget等相关内容就不谈了,按照官网的指导做就行安卓AppWidget
渠道的差异性
我们希望可以主动添加组件,无需用户手动长按桌面进入组件库找到并添加,官方提供了方法:
boolean AppWidgetManager.requestPinAppWidget()
这个方法的作用是可以主动请求添加小组件,返回值为bool类型,支持添加则为true。
以下渠道表现归纳如下:
综合表现:调用方法会弹出小组件添加提示确认框,点击确认后,会将小组件添加到桌面上,当前桌面页面空间不足以放置,会自动在桌面开启新一页,将小组件放置到新一页。
华为/honor:
是否弹确认框:是
是否空间不足新增一页放置:否,空间不足系统提示“当前页面空间不足”
OPPO/三星:
是否弹确认框:是
是否空间不足新增一页放置:是
小米/红米:
是否弹确认框:否
是否空间不足新增一页放置:是
其他:方法请求时,如果应用未开启授予“桌面快捷方式”权限,将不会添加到桌面
vivo/iqoo:
是否弹确认框:否
是否空间不足新增一页放置:是
其他:若不接入vivo平台的原子组件SDK, 并将小组件上架到vivo组件平台,并通过vivo原子组件平台审核测试通过,则此方法将无任何效果,即你不能主动将小组件添加到桌面。 相关链接:vivo原子组件
其他表现:
- 小组件添加确认弹框形态各异,取决于渠道,以及安卓SDK版本
- AppWidgetManager.requestPinAppWidget() 方法的返回值是代表是否支持主动将小组件添加到桌面,所以不管小组件添加到桌面成功与否,方法返回值都是true【除极少安卓SDK低版本不支持】
- AppWidgetManager.requestPinAppWidget() 方法第三个参数,支持传入一个PendingIntent,当小组件添加到桌面成功后,将触发回调,若添加失败则不会触发回调。这里就存在一个问题,调用此方法后不会触发回调,小组件是“还未添加到桌面”还是“添加桌面失败”,我们需要区分两种状态情景,以便异常处理。
- 华为不支持第3点,不管添加成功与否, 第三个参数PendingIntent都不会被隐式触发启动。
- 不同机型UI上的适配。在A设备小组件Cell占格可能为4 x 2, 到B设备就可能变为 5 x 3。此外小组件支持的UI控件与组件较少,在不同设备上要做好尺寸调整的UI适配。
- 关于小组件点击事件处理:app未启动,点击小组件的控件,触发PendingIntent,启动app,深度链接进入到指定页面,然后将app切到后台,回到桌面再次点击小组件同一控件,第二次触发PendingIntent启动,若Intent不设置Action主动清理Activity堆栈,app将自动由后台切回前台,此时如何取到Intent携带数据?在Activity的onNewIntent方法?没准你实践之后会有新思路。
- 关于添加到负一屏,目前没有统一的SDK,需要接入各大厂商渠道定制SDK或协议。
综上所述:
安卓小组件存在很多适配问题,如果需要实现较为优秀的交互和体验,需要接入各个厂商渠道定制的SDK,或遵循它们所制定的桌面组件管理系统的配置,光凭Android 官方提供的方法难以适配。