Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了当应用程序在Android Pie上受到后台限制时启动前台服务大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
使用 Android 9.0(PiE),用户可以限制您的应用程序通过设置进行后台工作.当我们尝试在Pie设备上启动前台服务时,如果应用程序受到后台限制,即使应用程序活动完全位于前台,@R_863_9616@程序也会遇到以下异常.

RemoteserviceException: Context.startForegroundservice() did not then call service.startForeground()

我们在启动的服务中调用startForeground(),但尝试启动服务时的系统日志显示

system_process W/Activitymanager: service.startForeground() not allowed due to bg reStriction

当你跟踪the documented steps前台服务时,看起来很奇怪,并且当你的应用程序也在前台时,系统拒绝启动前台服务的应用程序.我还没有找到与此相关的大量文档,但这是记录在案的行为吗?您的应用程序是否至少有一种方法可以知道它是否受到后台限制,因此不会尝试在前台启动服务?

当应用程序在Android Pie上受到后台限制时启动前台服务

我的服务代码基本上如下所示.我们的目标api是27.

class Myservice : service() {

    override fun onCreate() {
        super.onCreate()
        // create notification
        startForeground(NOTIFICATION_ID,notification)
    }

    override fun onStartCommand(intent: Intent?,flags: Int,startId: int): Int {
        if (intent == null || intent.action == null || intent.action == ACTION_STOp) {
            quit()
        }
        doWork()
        return START_NOT_STICKY
    }

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

    override fun onTaskRemoved(rooTintent: Intent?) {
        super.onTaskRemoved(rooTintent)
        quit()
    }

    private fun quit() {
        stopForeground(true)
        stopSelf()
    }

    companion object {

        fun start(context: Context) {
            val intent = Intent(context,Myservice::class.java)
            intent.action = ACTION_START
            ContextCompat.startForegroundservice(context,intent)
        }

        fun stop(context: Context) {
            val intent = Intent(context,Myservice::class.java)
            intent.action = ACTION_STOP
            ContextCompat.startForegroundservice(context,intent)
        }
    }
}

解决方法

想知道崩溃实际上会发生在Myservice.stop()中对ContextCompat.startForegroundservice()的第二次调用,我用它来发送一个带有“停止”动作的Intent来停止服务而不是调用context.stopservice( ).起初我然需要在服务中手动调用stopForeground(),但是调用context.stopservice()似乎停止了前台服务并且仍然删除通知并且不会导致崩溃,所以我决定重构我如何处理停止服务.

更新:我认为问题的另一部分还在尝试使用Intents来启动和停止服务,特别是因在某些情况下我的服务已启动然后停止太快.一个非常有用的thread with Ian Lake提供了有关服务的这些建议:

大佬总结

以上是大佬教程为你收集整理的当应用程序在Android Pie上受到后台限制时启动前台服务全部内容,希望文章能够帮你解决当应用程序在Android Pie上受到后台限制时启动前台服务所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。