美文网首页Android知识梳理
Android 8.0/Android O中启动服务,报错!di

Android 8.0/Android O中启动服务,报错!di

作者: 大川的川 | 来源:发表于2019-12-04 11:31 被阅读0次
    你瞅啥?
    有没有经历过绝望,其他版本的手机都好好的启动服务并且正常开启通知栏,oppo等个性十足的手机出现在你面前的时候,一脸懵逼有没有?就像我的这个问题一样,同样是8.0的系统,怎么oppo就那么个性?
    在Android O中,有一个新的背景限制。尝试启动startService()时,将获得IlleagalStateException,因此现在应使用startForegroundService(),但是如果通过此新方法启动服务,则会在屏幕截图中看到类似的错误。为避免此异常,您需要在startForegroundService()之后有5秒钟的时间来创建startForeground(),以通知用户您正在后台工作。否则将崩溃出现这样的崩溃信息:
    android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground()
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1961)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:198)
        at android.app.ActivityThread.main(ActivityThread.java:7015)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:523)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:850)
    
    那么我们该如何解决呢?通过查阅资料发现,解决起来也没有那么复杂,看看怎么个套路!
    1. 启动服务,适配启动方案
    //适配8.0以上的服务转前台服务 清单文件AndroidManifest中有配置 android.permission.FOREGROUND_SERVICE
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
        //适配8.0机制
        context.startForegroundService(intent);
    } else {
        context.startService(intent);
    }
    
    2. service服务中的onCreate()中加上如下代码
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { // 注意notification也要适配Android 8 哦
        startForeground(ID, new Notification());// 通知栏标识符 前台进程对象唯一ID
    }
    

    有上述步骤代码之后,我们就会发现,头不疼了,脸不懵逼了,吃嘛嘛香了!

    相关文章

      网友评论

        本文标题:Android 8.0/Android O中启动服务,报错!di

        本文链接:https://www.haomeiwen.com/subject/nzikgctx.html