返回

如何使用 BOOT_COMPLETED 启动 Android 10 及以上版本的应用?

Android

在 Android 10 及以上版本中使用 BOOT_COMPLETED 广播接收器

在 Android 9 及以下版本中,使用 BOOT_COMPLETED 广播接收器启动应用是一种常见的做法。然而,随着 Android 10 引入对后台广播的限制,这种方法在更高版本的 Android 中不再有效。本文将探讨该问题的解决方法,并提供详细的分步指南,帮助你从外部使用 BOOT_COMPLETED 启动 Android 10 及以上版本的应用。

理解问题

在 Android 10 及以上版本中,BOOT_COMPLETED 广播接收器无法直接启动应用。这是因为后台广播受到限制,从而阻止应用在设备启动后自动启动。

解决方法

为了解决此问题,我们需要采用一种新的方法:

  1. 创建 Manifest 权限:

    在你的应用清单 (AndroidManifest.xml) 中添加以下权限:

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    
  2. 更新 BootReceiver:

    修改你的 BootReceiver 以符合 Android 10 的后台广播限制。更新后的代码如下:

    class BootReceiver : BroadcastReceiver() {
    
        private val jobScheduler = context.getSystemService(JOB_SCHEDULER_SERVICE) as JobScheduler
    
        override fun onReceive(context: Context, intent: Intent) {
            if (intent.action == Intent.ACTION_BOOT_COMPLETED) {
                Log.w("bootbroadcastpoc", "scheduling job...")
    
                val intent = Intent(context, BootJobService::class.java)
                val jobInfo = JobInfo.Builder(0, ComponentName(context, BootJobService::class.java))
                    .setRequiredNetworkType(JobInfo.NETWORK_TYPE_NONE)
                    .build()
    
                if (jobScheduler.schedule(jobInfo) == JobScheduler.RESULT_SUCCESS) {
                    Log.w("bootbroadcastpoc", "job scheduled")
                } else {
                    Log.w("bootbroadcastpoc", "failed to schedule job")
                }
            }
        }
    }
    
  3. 创建 BootJobService:

    创建一个新的服务类,名为 BootJobService,该服务将在设备启动后负责启动应用:

    class BootJobService : JobService() {
    
        override fun onStartJob(params: JobParameters?): Boolean {
            Log.w("bootbroadcastpoc", "starting service...")
    
            val intent = Intent(this, KioskActivity::class.java)
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
            startActivity(intent)
    
            jobFinished(params, false)
            return true
        }
    
        override fun onStopJob(params: JobParameters?): Boolean {
            return true
        }
    }
    

    确保在 AndroidManifest.xml 中声明此服务。

结论

通过遵循本文中的步骤,你将能够从外部使用 BOOT_COMPLETED 广播接收器启动 Android 10 及以上版本的应用。这种方法符合 Android 10 及以上版本对后台广播的限制,同时仍然允许你在设备启动时启动应用。

常见问题解答

  • 为什么 Android 10 对后台广播施加了限制?
    为了提高设备电池寿命和性能,减少不必要的唤醒。

  • 还有其他方法可以在 Android 10 及以上版本中启动应用吗?
    有,可以使用 AlarmManagerFirebase JobDispatcher 在设备启动后安排任务。

  • 为什么我的应用无法在 Android 10 及以上版本中使用 BOOT_COMPLETED 启动?
    可能是因为你没有正确更新你的 BootReceiverBootJobService

  • 我可以在 Android 10 及以下版本中使用此解决方案吗?
    是的,这个解决方案也适用于 Android 10 及以下版本。

  • 我应该使用 AlarmManager 还是 Firebase JobDispatcher
    这取决于你的具体需求。AlarmManager 是 Android 中用于计划任务的原生 API,而 Firebase JobDispatcher 是 Google 提供的用于处理后台任务的库。