摘要
本期内容:如何隐藏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
进行启动,但是要注意顺序以及所有的属性一个也不能少。
不建议使用这样的配置方式,因为不方便后期扩展与维护。