Android杂项-隐藏桌面App图标
摘要
本期内容:如何隐藏Android App在桌面上的Launcher图标,并且支持 隐式协议 启动App。
需求
在多App框架结构的交互中,我们会有一个主App对用户可见,而其他的子App只做安装,不对用户在桌面上显示启动图标。针对这样的场景下,就需要将App的图标隐藏起来了,并且又必需保证隐藏的App能够提供一个入口被启动。
实现方案
1. 常规开发中的入口Activity配置
有启动器的App,入口Activity的基础配置如下:
<activity android:name=".MainActivity" android:launchMode="singleTask"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> 复制代码
2. 隐藏App的桌面图标
<activity android:name=".MainActivity" android:launchMode="singleTask"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <!-- 为了隐藏桌面图标,要注意三个属性的配置顺序 --> <!-- 这个data可以随意配置,最好是不会使用的host,目的就是为了隐藏launcher图标而已 --> <data android:host="hidelauncher.tyras.com" android:scheme="tyras" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> 复制代码
3. 隐式启动配置
<activity android:name=".MainActivity" android:launchMode="singleTask"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <!-- 为了隐藏桌面图标,要注意三个属性的配置顺序 --> <!-- 这个data可以随意配置,最好是不会使用的host,目的就是为了隐藏launcher图标而已 --> <data android:host="hidelauncher.tyras.com" android:scheme="tyras" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <!-- 这个为了隐式打开,隐藏桌面图标与隐式协议分开配置,更清晰。 --> <!-- DeepLink 协议,主协议,其它应用通用协议。 --> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:host="test.tyras.com" android:path="/main" android:scheme="tyras" /> </intent-filter> </activity> 复制代码
4. 验证测试
按照上面3个步骤的配置,就可以实现App桌面图标的隐藏,并且又支持隐式协议启动App了。
这个方案,不仅在使用AS直接运行安装时能够正常启动,而且可以使用隐式协议 tyras://test.tryas.com/main
进行启动。
测试隐式协议可以使用 adb
命令进行启动测试。
adb shell am start -d "tyras://test.tryas.com/main" 复制代码
实现过程中的弯路
网络上找的一些博文中,都只说了一半,不够清晰,而且只说了一部分,隐式启动没有配置清楚,有问题;
在印象中,Android的早期系统,记得可以把
launcher
改为default
就能实现的,测试时发现不对;
<category android:name="android.intent.category.LAUNCHER" /> 复制代码
改为
<category android:name="android.intent.category.DEFAULT" /> 复制代码
这个方案不行。
在常规的启动Activity的配置上,加上
data
的隐式协议时,不注意顺序,测试时发现,data
属性放在后面的情况下,桌面图标是隐藏不了的,因此,要注意3个属性的配置顺序;虽然可以将2个
intent-filter
合并起来配置,但是全部的属性都不能少。而且不建议这样配置。
<activity android:name=".MainActivity" android:launchMode="singleTask"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.VIEW" /> <!-- 隐藏桌面图标,同时支持隐式协议启动,要注意属性的配置顺序 --> <data android:host="test.tyras.com" android:path="/main" android:scheme="tyras" /> <category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> </intent-filter> </activity> 复制代码
这样配置,也可以使用隐私协议 tyras://test.tryas.com/main
进行启动,但是要注意顺序以及所有的属性一个也不能少。
不建议使用这样的配置方式,因为不方便后期扩展与维护。
作者:磨剑十年
链接:https://juejin.cn/post/7028771610593067045