如何使用 BOOT_COMPLETED 启动 Android 10 及以上版本的应用?
2024-03-01 09:00:43
在 Android 10 及以上版本中使用 BOOT_COMPLETED 广播接收器
在 Android 9 及以下版本中,使用 BOOT_COMPLETED
广播接收器启动应用是一种常见的做法。然而,随着 Android 10 引入对后台广播的限制,这种方法在更高版本的 Android 中不再有效。本文将探讨该问题的解决方法,并提供详细的分步指南,帮助你从外部使用 BOOT_COMPLETED
启动 Android 10 及以上版本的应用。
理解问题
在 Android 10 及以上版本中,BOOT_COMPLETED
广播接收器无法直接启动应用。这是因为后台广播受到限制,从而阻止应用在设备启动后自动启动。
解决方法
为了解决此问题,我们需要采用一种新的方法:
-
创建 Manifest 权限:
在你的应用清单 (
AndroidManifest.xml
) 中添加以下权限:<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
-
更新 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") } } } }
-
创建 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 及以上版本中启动应用吗?
有,可以使用AlarmManager
或Firebase JobDispatcher
在设备启动后安排任务。 -
为什么我的应用无法在 Android 10 及以上版本中使用
BOOT_COMPLETED
启动?
可能是因为你没有正确更新你的BootReceiver
或BootJobService
。 -
我可以在 Android 10 及以下版本中使用此解决方案吗?
是的,这个解决方案也适用于 Android 10 及以下版本。 -
我应该使用
AlarmManager
还是Firebase JobDispatcher
?
这取决于你的具体需求。AlarmManager
是 Android 中用于计划任务的原生 API,而Firebase JobDispatcher
是 Google 提供的用于处理后台任务的库。