Android杂项-隐藏桌面App图标

6,195 阅读2分钟

摘要

本期内容:如何隐藏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"

实现过程中的弯路

  1. 网络上找的一些博文中,都只说了一半,不够清晰,而且只说了一部分,隐式启动没有配置清楚,有问题;

  2. 在印象中,Android的早期系统,记得可以把 launcher 改为 default 就能实现的,测试时发现不对;

<category android:name="android.intent.category.LAUNCHER" />

改为

<category android:name="android.intent.category.DEFAULT" />

这个方案不行。

  1. 在常规的启动Activity的配置上,加上 data 的隐式协议时,不注意顺序,测试时发现, data 属性放在后面的情况下,桌面图标是隐藏不了的,因此,要注意3个属性的配置顺序;

  2. 虽然可以将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 进行启动,但是要注意顺序以及所有的属性一个也不能少。

不建议使用这样的配置方式,因为不方便后期扩展与维护。