求助:基于Expo SDK 48实现Android应用开机自启的配置插件开发
Expo SDK 48 安卓开机自启完整实现方案
要实现安卓开机自动启动Expo应用,仅添加权限是不够的,还需要自定义BroadcastReceiver并在AndroidManifest中注册,同时通过Expo配置插件完成文件注入和Manifest配置。以下是完整步骤:
1. 创建自定义BroadcastReceiver Java类
在项目根目录新建android/src/main/java/com/yourapppackage/(替换为你的应用包名,可从app.json的android.package字段获取),创建BootReceiver.java文件,内容如下:
package com.yourapppackage; // 替换为你的应用包名 import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; public class BootReceiver extends BroadcastReceiver { private static final String TAG = "BootReceiver"; @Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) { Log.d(TAG, "设备开机完成,启动应用"); Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName()); if (launchIntent != null) { launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(launchIntent); } } } }
2. 完善Expo配置插件
修改你已有的withAutoStart插件,添加文件复制和Manifest注册逻辑,完整代码如下:
import { AndroidConfig, ConfigPlugin, withAndroidManifest, withDangerousMod, } from "expo/config-plugins"; import fs from "fs"; import path from "path"; export const withAutoStart: ConfigPlugin = (config) => { // 添加RECEIVE_BOOT_COMPLETED权限 config = AndroidConfig.Permissions.withPermissions(config, [ "android.permission.RECEIVE_BOOT_COMPLETED", ]); // 复制BootReceiver.java到安卓项目对应目录 config = withDangerousMod(config, [ "android", async (props) => { const packageName = AndroidConfig.Package.getPackage(props); const targetDir = path.join( props.modRequest.platformProjectRoot, "app", "src", "main", "java", ...packageName.split(".") ); const targetPath = path.join(targetDir, "BootReceiver.java"); const sourcePath = path.join( process.cwd(), "android", "src", "main", "java", ...packageName.split("."), "BootReceiver.java" ); // 创建目标目录(如果不存在) if (!fs.existsSync(targetDir)) { fs.mkdirSync(targetDir, { recursive: true }); } // 复制文件 if (fs.existsSync(sourcePath)) { fs.copyFileSync(sourcePath, targetPath); } else { throw new Error(`BootReceiver.java 文件不存在于路径: ${sourcePath}`); } return props; }, ]); // 在AndroidManifest中注册BroadcastReceiver config = withAndroidManifest(config, async (props) => { const packageName = AndroidConfig.Package.getPackage(props); const manifest = props.modResults; // 添加receiver到application节点 manifest.application = manifest.application || []; manifest.application.push({ $: { "android:name": `${packageName}.BootReceiver`, "android:enabled": "true", "android:exported": "true", }, intent-filter: [ { action: [{ $: { "android:name": "android.intent.action.BOOT_COMPLETED" } }], category: [{ $: { "android:name": "android.intent.category.DEFAULT" } }], }, ], }); return props; }); return config; };
3. 配置app.json启用插件
在项目的app.json(或app.config.js)中添加插件引用:
{ "expo": { ... "plugins": [ "./path/to/your/auto-start-plugin.ts" // 替换为你的插件文件实际路径 ] } }
4. 测试验证
- 运行
eas build --platform android生成安卓安装包(或使用expo run:android进行本地构建) - 将安装包部署到测试设备,手动开启应用的自启动权限(部分安卓厂商会默认禁用,需在应用设置中找到「自启动管理」开启)
- 重启设备,验证应用是否自动启动
关键注意事项
- 小米、华为等厂商有严格的后台限制,除了自启动权限,还需开启「忽略电池优化」,否则开机自启可能失效
- 确保应用安装在设备内部存储,SD卡中的应用开机时无法被系统识别
- 必须使用物理设备测试,模拟器的开机行为与真实设备存在差异
内容的提问来源于stack exchange,提问作者ScreamZ
相关产品推荐
相关产品推荐

