android 5.0 api多少
答案:2 悬赏:0 手机版
解决时间 2021-02-11 14:47
- 提问者网友:饥饿走向夜
- 2021-02-11 07:17
android 5.0 api多少
最佳答案
- 五星知识达人网友:神鬼未生
- 2021-02-11 08:46
为使得你的app在Android获得更好的表现,请将你的targetSdkVersion设置成21。调用最新的Android 5.0 API的时候要注意在调用前判断系统版本号以兼容之前的系统版本。不能使用低于minSdkVersion的API。
全部回答
- 1楼网友:西风乍起
- 2021-02-11 08:55
context:
一个项目需要重写android resource类getdrawable方法,在系统调用resource.getdrawable时进行拦截,分两种情况:a情况仍旧走正常的调用;b情况则写定制的逻辑。
第一次尝试:
新建一个resource的子类,并重写getdrawable方法。1.正常调用是super.getdrawable 2.非正常时写自己的逻辑。
可发现在5.0上报错,5.0以下就没问题。
第二次尝试
上官网查了下,发现原来google在android 5.0上,新增了一个getdrawable(int id, resources.theme theme),系统不会再调用getdrawable(int id)方法,那当然也就拦截不到了,b情况的定制逻辑也就失效了。
把sdk的target调到5.0,重写getdrawable(int id, resources.theme theme),当然就ok了。可问题是我要在sdk4.+的情况下开发,那怎么办?
两种做法:在子类新建getdrawable(int id, resources.theme theme)进行重写,但是我还需要调用super.getdrawable(int id, theme theme)方法。在4.+的sdk环境下super即resource是没有这个办法的,那就没法实现a情况。这可怎么办。
用1.反射调用这个方法2.在方法名上加注释@targetapi{22}
可问题是反射、注解都没办法实现super.getdrawable这个调用的。
第三次尝试
1.在项目中新建一个android.content.res包结构,并建立resouce类。
2.将resource的源码复制到该类中,但是因为系统隐藏api等,可能会报错。
3.把所有方法的方法体内容都删除,返回值是对象的就return null,是基础类型的就随便return 基础类型,void就return。(因为sdk中的api是不会打包到apk中的,只是保持了api的引用,安装到手机上,会自动调用rom中的相关方法,所以这个复制的类只是为了让项目编译通过而已)。
4.给该类加上getdrawable(int id, resources.theme theme),这样我们子类重写resource方法时,就可以调用super.getdrawable(int id, resources.theme theme).。
第四次尝试
大功告成,但发现程序run as时没问题,但是打包就有问题了。
原因是打包会 调用混淆功能,resource因被我们复制的类替换了sdk中的类。可是导出apk时不包含这个resource类的,找不到引用就报错了。可实际上只要安装到手机上,就会调用系统rom中的resource类,所以不会产生实际的影响。也就是这个提示是没必要的,那怎么做呢?
在混淆的配置文件proguard-project.txt中加入
-dontwarn android.content.res.**
好了这才是大功告成了。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯