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

Flutter安卓应用中实现启动器选择对话框的方法求助

问题

我用Flutter开发Android启动器应用,想实现按下Home键时,弹出默认启动器和我的自定义启动器的选择框,带「仅一次」和「始终」选项。已经在AndroidManifest.xml加了下面的intent-filter,但没效果:

<intent-filter>
    <action android:name="android.intent.action.MAIN"/>
    <category android:name="android.intent.category.LAUNCHER"/>
    <category android:name="android.intent.category.HOME"/>
    <category android:name="android.intent.category.DEFAULT"/>
</intent-filter>

另外旧的intent包不兼容Dart3,之前从Stack Overflow拿的代码里intentFlutter函数现在找不到了,新的android_intent_plus包里不知道怎么实现启动器选择对话框。

解决办法

1. 先修正Manifest配置问题

别把LAUNCHER和HOME的分类放在同一个intent-filter里,拆分后系统才能正确识别你的应用是候选启动器:

<!-- 桌面图标用的入口 -->
<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

<!-- 启动器专属入口 -->
<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>

如果系统已经有默认启动器,你得先让用户去系统设置清掉默认,或者用代码主动唤起选择框。

2. 用android_intent_plus实现选择框

先在pubspec.yaml添加兼容Dart3的依赖:

dependencies:
  android_intent_plus: ^4.0.0 # 请使用最新稳定版本

然后编写唤起选择框的函数:

import 'package:android_intent_plus/android_intent_plus.dart';

void showLauncherChooser() async {
  final intent = Intent(
    action: 'android.intent.action.MAIN',
    categories: [
      'android.intent.category.HOME',
      'android.intent.category.DEFAULT',
    ],
    flags: [IntentFlag.activityNewTask], // 必须添加该Flag,否则无法正常唤起选择框
  );
  try {
    await intent.launch();
  } catch (e) {
    print('唤起启动器选择框失败: $e');
  }
}

3. 补充:处理Home键监听与默认启动器重置

Flutter无法直接监听Home键,需要借助Android原生代码或第三方插件实现。另外如果你的应用已被设为默认启动器,按下Home键不会触发选择框,此时可以引导用户去系统设置清除默认,用以下代码打开应用详情设置页:

import 'package:android_intent_plus/android_intent_plus.dart';
import 'package:package_info_plus/package_info_plus.dart';

void openLauncherSettings() async {
  final packageInfo = await PackageInfo.fromPackageInfo();
  final intent = Intent(
    action: 'android.settings.APPLICATION_DETAILS_SETTINGS',
    data: Uri.parse('package:${packageInfo.packageName}'),
  );
  await intent.launch();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 16:43:11