Android如何实现开机完成后自动启动APP?代码问题排查求助
问题排查
- 核心限制来自Android 10(API级别29)开始引入的后台Activity启动限制:系统禁止应用在后台未获得特殊权限的情况下直接启动Activity,你的广播接收器属于后台触发场景,原有直接调用
startActivity的逻辑在高版本系统上无法生效 - 次要问题:Android 3.1及以上系统默认阻止未被用户手动启动过的应用接收系统广播,若你的应用安装后从未被打开过,也会收不到开机完成广播
- 附加问题:你申请的相机、录音、存储权限都属于运行时危险权限,若未提前获得用户授权,即便Activity能成功启动也会触发权限异常崩溃
修复方案
方案1:申请悬浮窗权限绕过后台启动限制
- 在清单文件中新增权限声明:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
- 应用首次启动时引导用户跳转至权限设置页开启悬浮窗权限:
// 检查权限 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(context)) { Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + context.getPackageName())); startActivityForResult(intent, 1001); }
授予权限后原有广播中启动Activity的逻辑即可正常运行。
方案2:使用通知跳转替代直接启动Activity(更合规,无需特殊权限)
修改广播接收器的onReceive逻辑,收到广播后先弹出通知,用户点击通知后再跳转Activity:
@Override public void onReceive(final Context context, Intent intent) { Toast.makeText(context, "Home Task 3 Version ", Toast.LENGTH_LONG).show(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { // 高版本系统走通知跳转逻辑 Intent activityIntent = new Intent(context, CameraRecorderActivity.class); activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, activityIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); // 创建通知渠道(Android 8.0及以上需要) String channelId = "boot_start_channel"; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationChannel channel = new NotificationChannel(channelId, "开机启动提醒", NotificationManager.IMPORTANCE_HIGH); NotificationManager manager = context.getSystemService(NotificationManager.class); manager.createNotificationChannel(channel); } // 构建通知 Notification notification = new NotificationCompat.Builder(context, channelId) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle("点击启动录屏应用") .setContentText("设备开机完成,点击即可打开录屏功能") .setContentIntent(pendingIntent) .setAutoCancel(true) .build(); // 发送通知 NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context); if (ActivityCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED) { notificationManager.notify(1002, notification); } } else { // 低版本系统直接启动 Intent myIntent = new Intent(context, CameraRecorderActivity.class); myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(myIntent); } }
使用该方案需要注意Android 13及以上系统需要提前申请POST_NOTIFICATIONS通知权限。
额外注意项
- 应用安装后必须手动启动一次,否则无法接收开机广播
- 首次打开应用时必须引导用户授予相机、录音、存储等必要权限,避免后续启动Activity时崩溃
内容的提问来源于stack exchange,提问作者Bekzhan
相关产品推荐
相关产品推荐

