背景
Android10面世在即,Android市场(国内)各系统占有率现在如何呢?随着各大厂商积极布局高中低档手机,使得现在市面上Android手机版本普遍已经不低于6.0版本了。2018年中国智能手机出货3.9亿部,其中Android手机占比89.3%。网上找到了一份最新数据,展示了2019年Q2季度国内手机机型和系统分布:个推大数据:2019年Q2安卓智能手机报告,下面两张图分别展示了2019年Q2Android手机机型和系统分布
数据显示,2019年Q2季度华为手机市占率26.0%,继续领跑国产智能手机市场。OV手机分别以22.2%和20.2%的市占率位列第二、第三名,小米占比9.6%,三星占比5.9%。而从各大手机品牌主要机型分布来看,Top5机型最低系统已经是6.0以上,更不要说还包括了一些厂商自主升级系统。
从各个品牌手机系统分布来看,41.2%的华为用户和26.9%的小米用户已经升级到Android9,而大部分OPPO和vivo用户仍在使用8.1系统。
综上:是时候把你的targetSdkVersion
升到28了
(我才不会说是公司强制要求升级了呢)
AndroidO适配(targetSdkVersion
26或27)
这里我主要列出几个极大概率容易踩的坑
1.透明主题Activity
这个是在Android8.0手机上会出现的问题,是官方bug:只有全屏不透明的activity才可以设置方向,否则报错:
java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2957)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at adroid.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
这bug有点搞笑,官方8.1就修复了。巧了我手头这台MIX2就一直停留在8.0系统正好可以验证一下。果然不出所料,分享、支付回调、schema中间页全部中枪。
因为还有另一个bug:
Only fullscreen opaque activities can request orientation
坑啊!
解决办法:
- 去掉AndroidManifest中对应Activity的
screenOrientation
属性,或者直接在Activity中设置方向
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);// 横屏
setRequestedOrientation(ActivityInfo .SCREEN_ORIENTATION_PORTRAIT);//竖屏
setContentView(R.layout.activity_main);
}
- 或者单独建一个
values-v26
目录,单独给8.0版本适配
2.后台执行限制
在做静默登录的时候报了一个这样的错
Caused by: java.lang.IllegalStateException: Not allowed to start service Intent { cmp=com.example.oleky.demo/.BgService }: app is in background
这就是典型的后台执行限制报错信息。
①后台服务运行限制
处于空闲状态时,应用可以使用的后台服务存在限制。那么什么情况下算后台应用?
除了下面情况外都是后台应用
-
具有可见的Activity
-
具有前台服务
-
另一个前台应用已关联到该应用(通过bindService或者使用该应用的ContentProvider)。
后台服务Google推荐使用WorkManager
,workManager
可以适应不同的条件
如果应用程序没有运行,WorkManager会根据设备API级别和包含的依赖项选择适当的方式安排后台任务,可能会使用JobScheduler、Firebase JobDispatcher或AlarmManager。你不需要编写设备逻辑来确定设备有哪些功能和选择适当的API;相反,你只要把它交给WorkManager让它选择最佳的方式。
当然,想用它来保活的就洗洗睡吧
②广播限制
如果应用监听一些系统广播,当系统发出广播时,很多应用都会被唤醒,这会导致所有应用快速地连续消耗资源,从而降低用户体验。为了缓解这个问题,Android从7.0就开始对广播做限制,在8.0上的限制有:
-
动态注册的receiver,可接收任何显式和隐式广播。
-
targetSdkVersion为Android O(API level 26)及以上的应用,静态注册的receiver将不能收到隐式广播,但可以收到显式广播。
3.运行时权限
在 Android 8.0 之前,如果应用在运行时请求权限并且被授予该权限,系统会错误地将属于同一权限组并且在清单中注册的其他权限也一起授予应用。对于针对 Android 8.0 的应用,此行为已被纠正。系统只会授予应用明确请求的权限。然而,一旦用户为应用授予某个权限,则所有后续对该权限组中权限的请求都将被自动批准。例如,假设某个应用在其清单中列出 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE。应用请求 READ_EXTERNAL_STORAGE,并且用户授予了该权限。如果该应用针对的是 API 级别 24 或更低级别,系统还会同时授予 WRITE_EXTERNAL_STORAGE,因为该权限也属于同一 STORAGE 权限组并且也在清单中注册过。如果该应用针对的是 Android 8.0,则系统此时仅会授予 READ_EXTERNAL_STORAGE;不过,如果该应用后来又请求 WRITE_EXTERNAL_STORAGE,则系统会立即授予该权限,而不会提示用户。
一句话概括:现在用什么权限就要申请什么权限。这个我们目前基本没什么问题,因为我们基本上都是这么用的。
4.安装App
Android8.0以后移除了“允许未知来源”选项。以前我们只要打开了这个选项,就可以安装任意来源的App了,但现在不行,我们还需要给每个可以安装App的App添加这个权限(有点绕嘴…),即需要添加一个权限REQUEST_INSTALL_PACKAGES
,未声明这个权限的将不能安装其他应用。
一句话概括:想要你的App内下载安装其他应用,那么添加上这个权限,或者在安装之前自动去询问一下这个权限,引导用户开启这个开关
只能做到这样么???No,no,no
这个权限的限制使得我们在安装App时候阻拦了一部分人的安装,尤其是像vivo、oppo这种,还需要输入密码框的,让人一看就头大,犹豫要不要安装,降低了下载转化率。
SO,我们有个讨巧的方法,像vivo、oppo、华为这些系统,我们直接在引流下载的地方直接让他跳转到对应厂商的OEM商店(就是手机自带应用商店)
前提是你的应用已经在对应手机平台应用商店上线了
5.其他
其实8.0还有很多调整,譬如应用图标自适应啦、findviewById不用再强转啦、通知加channelId啦,全局浮层权限之类的,用到的几率不是很大,或者已经被sdk方封装好了,这里就不一一说了。具体的大家可以去谷歌官方Android8.0 功能和Api查看。下一篇说一说AndroidP升级需要注意的点。
共同学习,写下你的评论
评论加载中...
作者其他优质文章