Android的category.LAUNCHER与installLocation设置失效问题

本文介绍了如何在Android应用中设置启动页及APK安装位置。包括配置启动活动、指定安装位置选项及其对启动器的影响等内容。

一、Android选择启动页

  <activity
            android:name=".activity.HelloActivity"
            android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

        </intent-filter>


  </activity>

二、Android设置APK安装位置

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="string"
          android:sharedUserId="string"
          android:sharedUserLabel="string resource" 
          android:versionCode="integer"
          android:versionName="string"
          android:installLocation=["auto" | "internalOnly" | "preferExternal"] >
</manifest>
android:installLocation可以设置为"auto"、"internalOnly"、"preferExternal"三个值中的任何一个.
auto:程序可能被安装在外部存储介质上(例如:SD Card),但是默认会被安装到手机内存中.当手机内存为空时,程序将被安装到外部存储介质上.当程序安装到手机上后,用户可以决定把程序放在外部储介质还是内存中.
internalOnly:默认值.当设置为该值时,程序只能被安装在内存中,如果内存为空,则程序将不能成功安装.
preferExternal:将程序安装在外部存储介质上,但是系统不保证程序一定会被安装到外部存储介质上.当外部存储介质不可以或空时,程序将被安装到内存中.程序使用了forward-locking机制时也将被安装到内存中,因为外部存储不支持此机制.程序安装后,用户可以自由切换程序应该在外部还是内部存储介质上.

三、category.LAUNCHER与installLocation的矛盾

1、设置Android的启动自己的Launcher,如果在设置android:installLocation="preferExternal",则启动自己的Launcher失效

2、设置Android的启动自己的Launcher,最好设置android:installLocation="internalOnly",则启动自己的Launcher有效

 

 

 

Android 中,`android.intent.category.LAUNCHER` 和 `android.intent.category.HOME` 是两个非常重要的 **Intent Category(意图类别)**,它们用于描述 Activity 的行为和用途。虽然都“启动”有关,但作用完全不同。 --- ## ✅ 一、核心区别概览 | 特性 | `LAUNCHER` | `HOME` | |------|-----------|--------| | 用途 | 标记应用的入口 Activity,在桌面图标中显示 | 标记为系统的“主屏幕”应用(即桌面启动器) | | 所属组件 | 普通 App 的 `MainActivity` | 启动器 App(Launcher)如 Nova, Pixel Launcher | | 是否可多个 | 可以有多个 LAUNCHER Activity(不推荐) | 系统会提示用户选择默认 HOME 应用 | | 典型使用场景 | 用户点击图标启动你的 App | 用户按下「Home」键时启动该 Activity | --- ## 📦 二、详细解释代码示例 ### 1. `android.intent.category.LAUNCHER` 这是最常见的 category,用来表示: > “这个 Activity 应该出现在应用抽屉或主屏幕上作为一个可启动的图标。” #### ✅ 使用方式(在 `AndroidManifest.xml`) ```xml <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> ``` - 必须配合 `ACTION_MAIN` 使用。 - 表示这是 App 的主入口点。 - 系统 Launcher(桌面)会扫描所有带有 `LAUNCHER` 类别的 Activity,并为其创建快捷方式。 > 🔔 注意:即使一个 App 有多个 Activity 声明了 `LAUNCHER`,每个也会单独出现在桌面上(像“双开助手”那样)。 --- ### 2. `android.intent.category.HOME` 这个 category 用于声明: > “我是一个替代系统桌面的应用程序(Launcher)”。 当用户按下设备上的 **Home 键** 时,系统会查找所有注册了 `HOME` 类别的 Activity,并允许用户选择默认启动器。 #### ✅ 使用方式 ```xml <activity android:name=".LauncherActivity" android:exported="true"> <intent-filter android:persistentTask="true"> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> ``` #### 关键说明: - `category.DEFAULT` 是必须的,因为 `Context.startActivity()` 默认包含 `DEFAULT`。 - 用户首次按 Home 键时,系统弹出选择器:“选择一个主屏幕应用”。 - 用户可以选择“始终”使用某个 Launcher,也可以“仅此一次”。 - 如果你的 App 设置为默认 HOME,它就变成了手机的桌面(类似小米桌面、Nova Launcher)。 --- ## 🔍 三、深入对比分析 | 对比项 | `LAUNCHER` | `HOME` | |-------|----------|--------| | 谁使用? | 几乎所有 App | 只有启动器类 App(Launcher) | | 出现位置 | 桌面图标列表 | Home 键响应候选列表 | | 是否需要用户选择? | 否(自动添加到桌面) | 是(首次按 Home 键需选择) | | 如何取消设置? | 卸载 App 或清除默认设置 | 设置 → 应用 → 默认应用 → 主屏幕 | | 可否共存? | 多个 App 可同时有 LAUNCHER | 多个可安装,但只能一个设为默认 | | 权限要求 | 无特殊权限 | 无需特殊权限,但需完整实现 Launcher 功能 | --- ## 💡 四、常见问题最佳实践 ### ❓ 为什么我的 Activity 加了 `LAUNCHER` 却没出现在桌面? 检查以下几点: 1. ✅ `android:exported="true"`(尤其在 targetSdk >= 31 时必需) 2. ✅ 包含 `<action android:name="android.intent.action.MAIN" />` 3. ✅ 没有拼写错误:`category.LAUNCHER` 不是 `LAUCNHER` ```xml <!-- 正确 --> <category android:name="android.intent.category.LAUNCHER" /> <!-- 错误(不会生效) --> <category android:name="android.intent.category.LAUCNHER" /> ``` --- ### ❓ 我能同时声明 `LAUNCHER` 和 `HOME` 吗? ✅ **可以!** 例如你正在开发一个自定义桌面 App(Launcher),你希望: - 它有一个桌面图标(可打开设置页面) - 同时也能响应 Home 键 你可以这样写: ```xml <activity android:name=".LauncherSettingsActivity" android:exported="true"> <!-- 主入口图标 --> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".HomeActivity" android:exported="true"> <!-- 响应 Home 键 --> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> ``` --- ### ❓ 如何判断当前是否是我的 HOME 应用被设为默认? ```java PackageManager pm = getPackageManager(); ComponentName homeComponent = pm.getHomeActivities(new ArrayList<>()); Log.d("HomeApp", "Default Home: " + homeComponent); ``` 如果返回非空,则说明你的 App 或其他 Launcher 已被选为默认 HOME。 --- ## ⚠️ 五、注意事项 1. **不要滥用 `HOME`** - 只有真正的桌面启动器才应该注册 `HOME`。 - 普通 App 添加 `HOME` 会被视为“误导用户”,可能影响审核(如上架商店)。 2. **避免多个 MAIN+LAUNCHER** ```xml <!-- 不推荐 --> <activity A> MAIN + LAUNCHER </activity> <activity B> MAIN + LAUNCHER </activity> ``` 这会在桌面生成两个图标,容易让用户困惑。 3. **Android 10+ 的限制** - 某些厂商 ROM(如 MIUI、EMUI)会对非系统 Launcher 增加限制(后台冻结等)。 --- ## ✅ 总结 | 类别 | 目的 | 典型用途 | |------|------|---------| | `android.intent.category.LAUNCHER` | 让 Activity 显示为桌面图标 | 所有 App 的主界面 | | `android.intent.category.HOME` | 声明自己是“桌面启动器” | 自定义 Launcher App | > 💬 简单记忆: > - **LAUNCHER = “我能被启动”** > - **HOME = “我可以做桌面”** ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值