Android 5.0之后隐式声明Intent 启动Service引发的问题
来源:互联网 发布:php代理分销系统源码 编辑:程序博客网 时间:2024/06/03 21:34
一.概述
Android系统升级到5.0之后做了不少的变化(5.0变化),开发人员一定要注意这些变化,要不然就有的折腾了.这次最大的变化应该是把Dalvik虚拟机改成了ART(Android Runtime),后续会专门讲解这一块.其他的都是一些零碎的问题,例如前段时间发了一篇Android 5.0之后修改了HashMap的实现(传送门).这篇主要讲一下遇到跟Service相关的问题.
二.详情
Service身为Android四大组件之一,它的使用频率还是比较高的,并且现在主要都是运用在比较关键的部位,例如升级推送等.在Android 5.0之后google出于安全的角度禁止了隐式声明Intent来启动Service.也禁止使用Intent filter.否则就会抛个异常出来.
官方的解释如下.
那么google到底是怎么限制的呢?限制的判定条件是什么呢?这些都可以从Android 4.4和Android 5.0的源码中找到区别.
在Android 4.4的ContextImpl源码中,能看到如果启动service的intent的component和package都为空并且版本大于KITKAT的时候只是报出一个警报,告诉开发者隐式声明intent去启动Service是不安全的.再往下看,丫的异常都写好了只是注释掉了,看来google早就想这么干了.
果然在Android 5.0的源码中上面注释的代码已经不注释了,当targetSdkVersion版本大于LOLLIPOP直接异常抛出来,要求Service intent必须显式声明.所以如果开发的应用指定targetSdkVersion版本是小于LOLLIPOP的话还是按以前的方式给报个警报,这也就造成了如果没有做了完善的Android 5.0兼容就贸然把targetSdkVersion升到LOLLIPOP的话很有可能就会碰到这个问题.并且这个问题是很严重的,想象一下,你的app自升级的Service是隐式启动的,碰到这个问题后app就不能自升级了,这批用户有可能就一直停留在当前版本.会产生很致命的问题.从源码中的逻辑来看的话,判断一个intent是不是显式声明的点就是component和package,只要这两个有一个生效就不算是隐式声明的,接下来继续分析一下Intent的源码,可以看到下面三种构造方式,设置action来声明Intent是没有构建component的,所以显式声明需要用到第一和第二种构造(还有带packagename或component的拷贝构造),或者后面设置package属性.
三.案例分析
reBuild一下,然后去主项目build文件夹里面的中间资源里面找到module打成的jar包,直接把编译好的.class解压出来.
解压某盟的SDK,进入到正确的路径下直接替换刚才编译出来的.class文件.
回到SDK的跟目录下,运行 jar cvf sdk.jar * 命令进行重打包,将重新打好的SDK替换到项目里面.验证bug.BinGo!搞定!这样就可以打个dex补丁包给线上的版本更新过去修复5.0兼容的bug了.
四.总结
- Android 5.0之后隐式声明Intent 启动Service引发的问题
- Android 5.0之后隐式声明Intent 启动Service引发的问题
- Android 5.0之后隐式声明Intent 启动Service引发的问题
- Android 5.0之后隐式声明Intent 启动Service引发的问题
- Android 5.0之后隐式声明Intent 启动Service引发的问题
- Android 5.0之后隐式声明Intent 启动Service引发的问题
- Android 5.0之后隐式声明Intent 启动Service引发的问题
- Android 5.0之后隐式声明Intent 启动Service引发的问题
- Android 5.0之后使用隐式Intent方式启动Service
- AIDL通信 android 在5.0以使用隐式Intent方式来启动Service的问题
- Android 5.0之后禁止用隐式Intent启动Service
- android5.0之后不允许使用隐式Intent启动Service
- Android 5.0 禁止使用隐式Intent来启动Service.异常:service intent must be explicit
- android service隐式启动的问题
- Android 5.0之后启动Service 服务的方式
- Android使用Intent启动Service的Intent必须是显式的
- Android Lolipop 屏蔽隐式Intent检查引发的错误
- 解决Android 5.0版本之后出现的异常:Service Intent must be explicit
- 微信小程序入门四: 导航栏样式、tabBar导航栏
- 码流 / 码率 / 比特率 / 帧速率 / 分辨率 / 高清
- 安装文本编辑器Geany
- 洛谷1216 [USACO1.5]数字金字塔 Number Triangles
- MairDB连接表(五)
- Android 5.0之后隐式声明Intent 启动Service引发的问题
- hdu Eddy's research II(递推,找规律,打表)
- Android开发之关于使用PopWindow点击外部不消失的解决实例
- chrome 插件 vimium 介绍
- 视频带宽计算公式(码流_分辨率_帧率)
- (POJ 2965)The Pilots Brothers' refrigerator <大神:神思维>
- 微信订阅号开发模式基本配置
- 一个Android项目搞定所有主流架构:MVP+单元测试
- 数据结构—链表的复习