给Launcher加图标的新方式 - 悟空

646 阅读4分钟

如果你对动态添加快捷方式感到困惑,试试Wukong吧?!

Demo in GitHub

The English Document is HERE!

为啥要整这么个 Module?

之前做奶由壁纸主题的时候,我们只针对Android 8.0以上系统可用的应用图标更换功能(通过ShortcutManager/ShortcutManagerCompat)。结果越来越多的用户反馈没有办法设置图标,一问,原来都是 8.0 以下的机器……

看了一些文章,发现其实换图标一直都可以,只要姿势正确就行🤔(发广播,通知Launcher做更新操作)。想着说干就干罢。查阅了一些资料之后决定先试着做做,于是有了这篇文章,和这个 Repository。这应该也是我人生第一次做一个开源的 Android 模块项目(顺便写个 Compose Demo 练练手😁)。

如何使用?

很简单!~整个模块只需要关心一个名为Wukong工具类和一个名为CustomShortcutInfo数据类

我墙裂建议你使用CustomShortcutInfo类作为你展示应用列表的数据实体类,因为你可以直接通过RecyclerViewAdapter,或是LazyColumn的当前选中的项目index来获取直接可用的 item,而不是在设置图标之前将PackageInfo映射为CustomShortcutInfo(虽然在获取应用列表的时候肯定要做这样的一个映射就是了……)。

CustomShortcutInfo

这个数据类的构造函数包含7个参数:

  • originAppIconDrawable:这个参数存放应用的图标 Drawable
  • originAppName:这个参数存放应用的原应用名
  • packageName:顾名思义,这里存放 App 的包名
  • activityPkgName:指定Activity对应的包名
  • activityClzName:指定Activity对应的类名
  • action(可选) 设置需要访问的Activityaction
  • category(可选) 设置需要访问的Activitycategory

一些小提示

  • 可以通过调用ApplicationInfo.loadIcon(PackageManager来获取对应App的图标Drawable;
  • 可以通过调用ApplicationInfo.loadLabel(PackageManager)来获取App名称。
    • 当然,有原名那肯定还有自定义的名称,但如果你不需要自定义名称,没有关系,没有自定义新快捷方式名称的时候会主动使用原应用的名称(当然,在Android 8.0以下的时候会用一些小技巧规避一些问题,具体可以先看源码);
  • 可以通过调用ApplicationInfo.getPackageName()来获取应用包名;
  • 默认情况下,与Activity有关的几个参数,对应的Activityaction值为Intent.ACTION_MAIN,且category值为Intent.CATEGORY_LAUNCHER,具体还需要根据调用PackageManager.queryIntentActivities(Intent, Int)时传入的Intent对象决定

当然,设计这样一个 Module 当然是为了更换图标的图片!你完全可以将想作为图标的位图设置给customAppIconBmp属性;

还有,如果你想要更换快捷方式的名称,可以考虑设置customAppName属性;

当手机系统为Android 8.0之下,你还可以通过手动设置duplicatable属性控制快捷方式能否重复。这个属性默认为true

如果需要的话,你还可以设置flags来修改启动Activity的方式。

Wukong

这个工具类有两个公开方法:

  • isRequestPinShortcutSupported:判断是否能动态添加快捷方式
  • requestPinShortcut:尝试动态添加快捷方式,成功返回true,反之false

这俩方法很简单的,大🔥有问题可以自行看一看源码(

还有一件事……

如果你在 GitHub 上看到这段介绍,也许你已经 clone 过或者运行过我的这个Repo里的内容了。这个 Repo 采用了Jetpack Compose来编写界面,同时展示Wukong模块的功能。在这个 Demo 里我还用到了MVI架构,或许可以帮助一些初学 Android 的开发者来了解一些最新的Android开发技术!

开发过程中遇到的问题

  1. 在适配Android 8.0以下的设备时,发现找到的一个早期轮子可用,但代码流程保持不变地平迁到自己的 Demo 中时却总是失效。在排查了数日之后,最终发现设置的快捷方式名称和已有的应用名称同名,会导致无法添加新的快捷方式……于是我直接在原应用名称的首位添加了两个几乎没有宽度的空白字符,解决了这个问题(笑)。

  2. 目前还没能解决Android 8.0以上的快捷方式自带角标的问题……如果有大佬有解决方案还望多多评论提PR啥的,让我再学一点吧!!!


本文持续更新(20220105)