Android应用之【隐藏桌面图标的一种方法】

Android10之前的版本,应用程序调用方法PackageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP)可以隐藏在桌面上的图标,这样的程序如果被偷偷安装后,机主本人可能并不知道自己的手机被安装了某些程序。

但是android10之后的版本,如果应用中使用了四大组件(activity ,service ,broadcast, contentprovider)或者需要动态申请权限,这个函数调用将失去效果,简单测试后,调用该方法后,程序的桌面图标效果如下:

  1. 若AndroidManifest.xml中activity的icon和roundIcon这两者都不是黑色,显示资源文件中定义的图标像素。
  2. 如果activity中的icon和roundIcon同时设置为黑色,则icon不显示,roundIcon显示为系统默认的空白图标。

因此,传统的方法调用将不再适用了。

网上流传一种方式是,设置activity的label为空字符串“”,icon和roundIcon的像素值为0的黑色图标。该方案链接为:
Android10.0应用图标隐藏方案(7.0-10.0)

上述方法中,icon和roundIcon的图标资源文件如下:
在这里插入图片描述

上文中,theme字段透明的设置:
在这里插入图片描述

实际测试后,这种方法的隐藏效果有重大缺陷,在调用本文开头的PackageManager.setComponentEnabledSetting方法后,桌面上的图标虽然被抹去了,但是留下了一个图标大小的黑影,并不像作者在文中所说的那样"完全看不到", 作者源码我在android12上亲自测试过,这时候,点击图标虽然完全没有效果,但是视觉上的缺陷是无法容忍的。

通过测试,我发现有一种隐藏图标的方式,其实现步骤如下:

  1. 设置主activity的intent-filter字段,其格式必须满足如下两点,一是在启动节点的activity中,包含默认的启动属性"android.intent.action.MAIN"和"android.intent.category.LAUNCHER",二是还要添加别的属性,比如android.intent.action.VIEW,这样作的目的就是破坏应用程序启动节点的默认设置,使之含有别的行为和动作,这样程序启动后就不能正常显示图标。

比如启动节点的如下设置:
在这里插入图片描述

  1. 使用Android scheme方式从浏览器启动(或者另外再安装一个程序,当作此程序的启动器)。要注意的是,浏览器scheme启动方式不是说客户端的浏览器访问路径触发启动应用程序,我原先以为,在客户端的浏览器中输入形如myscheme://myhost这样的url就可以触发程序的执行,但是反复测试没有效果,于是想到,会不会这种scheme方式,说的是访问服务器的web页面,该地址的页面中有个形如 “<a href=“myscheme://myhost”>点击此处启动Android程序</a>” 这样的标签,用户在浏览器中点击这个标签后,即可触发应用中Android的启动组件。

这个简单的逻辑,无形中浪费了很多时间。

源码如下,上述描述的内容,只需要关注测试项目中AndroidManifest.xml中的Application节区属性。

源码链接地址