在Android10之前,应用程序通过调用PackageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP)函数来实现图标隐藏。
但是在android10之后,所有带四大组件(activity service broadcast contentprovider)和需要声明申请权限的应用,调用这个函数将失去效果,经过测试效果如下:
- 若activity的icon和roundIcon这两者都不是黑色,则调用后显示实际的像素值。
- 如果activity的icon和roundIcon同时设置为黑色,调用后,icon不显示,roundIcon显示系统默认的空白背景图标。
网上一种方式是,设置activity的label为空字符串“”,icon和roundIcon像素值为0的黑色图标。该方案链接如下:
Android10.0应用图标隐藏方案(7.0-10.0)
上面链接中,icon和roundIcon的图标文件如下:
上文中,theme字段透明的设置:
通过实际测试,这种方法的隐藏效果是有重大缺陷的,在调用开始的隐藏函数后,桌面上的图标虽然抹去了,但留下了一个图标大小的阴影,并不是文中所说的完全看不到(作者源码我在android12上亲自测试过),这时候点击虽然没有效果,但是视觉上的缺陷是不能容忍的。
通过实际测试,我发现有一种隐藏图标的方式,其实现步骤如下:
- 设置主activity的intent-filter字段,其格式必须满足如下两点,一是在启动节点的activity中,除却"android.intent.action.MAIN"和"android.intent.category.LAUNCHER"外,还要添加别的条目,比如android.intent.action.VIEW,目的就是打乱应用程序启动节点的默认设置,使之含有别的行为和动作,不能正常显示图标。
- 使用Android scheme方式从浏览器启动(或者另外再安装一个程序,当作此程序的启动器)。要注意的是,浏览器scheme启动方式不是说的从客户端,我原先以为,在客户端的浏览器中输入形如myscheme://myhost这样的url会触发程序的启动,但是反复测试是在没有效果,于是便想到,会不会这种scheme方式,说的是访问服务器的页面,页面中有个形如 “<a href=“myscheme://myhost”>点击此处启动Android程序</a>” 的标签,客户端浏览器中点击后,即可启动客户端本地的Android组件。
经过测试,发现上述方法是完全可行的,也基本达到了预期目的。
测试源码地址如下,各位看官只需要揣摩一下AndroidManifest.xml文件中的Application节区即可。
源码地址