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

求助:基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 10:05:40