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

Android TV应用开机自启:模拟器测试方法及代码排查

Android开机自启功能测试与问题排查

已完成的配置

1. 权限声明

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

2. 广播接收器注册

<receiver
    android:name="com.portlmedia.streets.BootReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter android:directBootAware="true">
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
        <action android:name="android.intent.action.QUICKBOOT_POWERON" />
        <action android:name="android.intent.action.REBOOT"/>
    </intent-filter>
</receiver>

3. BootReceiver实现

public class BootReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
            Intent activityIntent = new Intent(context, MainActivity.class);
            context.startActivity(activityIntent);
        }
    }
}

遇到的问题

在Android Studio模拟器中测试开机自启功能时,onReceive方法的断点未触发,冷重启模拟器也无效,无法确认功能是否正常或代码存在问题。


代码问题排查

  1. 启动Activity缺少必要标记
    从广播接收器中启动Activity必须添加FLAG_ACTIVITY_NEW_TASK标记,否则会抛出运行时异常导致启动失败。修改onReceive方法:

    @Override
    public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
            Intent activityIntent = new Intent(context, MainActivity.class);
            activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(activityIntent);
        }
    }
    
  2. 未匹配注册的所有开机Action
    注册时添加了LOCKED_BOOT_COMPLETED、QUICKBOOT_POWERON等Action,但代码仅判断ACTION_BOOT_COMPLETED,部分设备/模拟器可能发送其他开机触发Action,建议补充判断:

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (Intent.ACTION_BOOT_COMPLETED.equals(action) 
            || Intent.ACTION_LOCKED_BOOT_COMPLETED.equals(action)
            || Intent.ACTION_QUICKBOOT_POWERON.equals(action)) {
            Intent activityIntent = new Intent(context, MainActivity.class);
            activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(activityIntent);
        }
    }
    
  3. directBootAware属性的冗余设置
    如果你的应用不需要在设备解锁前运行,建议移除android:directBootAware="true",该属性会让接收器在锁定状态下触发,若未配置对应权限可能导致逻辑异常。


模拟器测试步骤

  1. 先手动启动应用一次
    Android系统要求应用必须被用户手动启动过一次,才能接收BOOT_COMPLETED类广播。先运行应用确保安装并启动完成。

  2. 用ADB命令模拟开机广播(高效测试)
    无需重启模拟器,直接通过ADB发送广播验证接收器逻辑:
    在Android Studio Terminal或系统命令行执行:

    adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n com.portlmedia.streets/.BootReceiver
    

    注意替换com.portlmedia.streets为你的应用包名,.BootReceiver为接收器类名(也可使用完整路径com.portlmedia.streets.BootReceiver)。

  3. 真实重启模拟器的正确方式
    若要测试真实开机场景:

    • 点击模拟器右上角的三个点图标,选择Power > Restart,等待模拟器重启完成。
    • 不要直接关闭模拟器再打开,该操作属于冷启动但可能不会触发完整的开机广播流程。
  4. 通过Logcat验证广播接收
    在Android Studio的Logcat中,过滤BootReceiver或搜索ACTION_BOOT_COMPLETED,查看广播是否被接收,以及是否存在启动Activity失败的异常日志。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:17:07