You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android TV启动器开发:按下Home键唤起应用Activity的实现

Android TV 启动器接管 Home 键的解决思路

1. 修正 Manifest 中的 Intent Filter 配置

你的配置里混淆了应用列表启动和 Home 键触发的规则,Android TV 有专属的 Home 分类,需拆分 Intent Filter 并补充关键配置:

<activity
    android:name=".AppActivity"
    android:excludeFromRecents="true"
    android:exported="true"
    android:launchMode="singleTask"
    android:stateNotNeeded="true">
    <!-- 用于在应用列表中显示的过滤器 -->
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
    </intent-filter>
    <!-- 用于接管 Home 键的核心过滤器 -->
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.HOME" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.LEANBACK_HOME" /> <!-- Android TV 专属 Home 分类 -->
    </intent-filter>
</activity>
  • LEANBACK_HOME 是 Android TV 识别默认启动器的关键分类,之前的配置缺失该项,导致系统无法将你的应用判定为 TV 级 Home 启动器。
  • 拆分过滤器避免分类冲突,让系统清晰识别两种启动场景。

2. 引导用户设置默认启动器

系统只会在存在多个 Home 应用时弹出选择框,若用户未主动选择,需主动检测并引导:

private void checkAndSetDefaultLauncher() {
    PackageManager pm = getPackageManager();
    Intent homeIntent = new Intent(Intent.ACTION_MAIN);
    homeIntent.addCategory(Intent.CATEGORY_HOME);
    ResolveInfo defaultResolve = pm.resolveActivity(homeIntent, PackageManager.MATCH_DEFAULT_ONLY);
    
    // 检查当前默认启动器是否为自身
    if (!defaultResolve.activityInfo.packageName.equals(getPackageName())) {
        // 跳转到系统默认启动器设置页
        Intent settingsIntent = new Intent(Settings.ACTION_HOME_SETTINGS);
        startActivity(settingsIntent);
    }
}

在 AppActivity 的 onCreate 或 onResume 中调用该方法,确保用户完成默认设置。

3. 尝试拦截 Home 键事件(高版本系统受限)

Android 8.0+ 系统对 Home 键拦截做了限制,但部分设备仍可通过重写按键事件补充处理:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_HOME) {
        // 确保自身回到前台
        Intent intent = new Intent(this, AppActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(intent);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

注意:此方法仅作为兜底方案,核心仍需依赖成为系统默认启动器。

4. 调整 Activity 属性

  • 暂时移除 android:excludeFromRecents="true" 测试:部分系统会将「排除最近列表」的应用排除在默认启动器候选之外。
  • 保持 launchMode="singleTask":确保每次触发 Home 键时复用已有 Activity 实例,避免重复创建。

5. 适配厂商定制系统

部分 TV 厂商会锁定默认启动器,需额外处理:

  • 检查是否需要申请厂商特定权限(部分品牌需加入白名单)。
  • 测试中若系统仍拒绝识别,可尝试添加 android.intent.category.MONKEY 之外的冗余分类(如 android.intent.category.TV),提升系统识别优先级。

内容的提问来源于stack exchange,提问作者Logic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 07:05:43