如何解决错误:Not allowed to start service Intent: app is in background uid?

3

我有一个服务,它是通过启动完成事件启动的,但应用程序会崩溃,并显示上述错误消息。请帮忙解决如何在广播接收器的启动完成事件上启动我的服务。

MyService.kt

class MyService : Service() {

    override fun onCreate() {
        Log.d(TAG, "onCreate")
    }
    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        return START_STICKY
    }

    override fun onBind(intent: Intent?): IBinder? {
        return null
    }

    override fun onDestroy() {
        Log.d(TAG, "DO SOME STAFF")
    }
}

MyBroadCaster.kt

class StartRelayServiceAtBootReceiver : BroadcastReceiver() {
     override fun onReceive(context: Context, intent: Intent) {

        if (Intent.ACTION_BOOT_COMPLETED == intent.action) {
            val serviceIntent = Intent(context, MyService::class.java)
            context.startService(serviceIntent)
        }
    }
}
2个回答

6
通过一些搜索,我得知我需要检查SDK版本,然后可以将其作为前台服务启动,或者仅使用startService启动;
class StartRelayServiceAtBootReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {

        if (Intent.ACTION_BOOT_COMPLETED == intent.action) {
            val intent = Intent(context, MyService::class.java)
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                context.startForegroundService(intent)
            } else {
                context.startService(intent)
            }
            Log.i("Autostart", "started")
        }
    }
}

2
在后台应用上有一些限制。显然,如果设备刚刚启动,所有应用程序都处于“后台”状态。您无法从后台应用程序启动Service。您可能需要使用JobScheduler来实现您想要的功能。
请参阅此文档,了解有关后台应用程序限制以及如何迁移到其他允许的解决方案的讨论:

https://developer.android.com/about/versions/oreo/background


非常感谢。我查看了它,帮助我理解了后台服务的限制,这进一步帮助我进行了搜索,并得到了我发布的答案。谢谢。 - user12423529
如果这个答案有帮助,你可以通过点击答案旁边的绿色勾号接受它。这将把问题从未回答的问题列表中移除,并提高你的采纳率,同时也会给我一些声望分数。或者你也可以接受自己的答案。 - David Wasser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接