6.0系统全称为Marshmallow,Google 2015年I/O大会上正式发布,目前市场份额也在持续上涨,它有着众多模块的更新。
主要更新模块
- 电源管理(Android6.0 引入了下列特性来延长电池使用时间)
- App Standby(应用待机)
- 检测:当设备部充电,且在这时间内用户没有直接或间接的启动该应用。
- 退出:当应用被激活时,或者设备充电时,系统将应用移除此状态。
- Doze(瞌睡)
- 检测:当设备不充电,且当设备静止且灭屏一段时间。
- 周期:平台尝试让系统处于休眠状态,周期性地进入在一个维持窗口恢复正常操作,然后进入更长的休眠状态。
- Exemptions(豁免)
预装在设备上的系统应用和云消息服务,默认通常被豁免。应用开发者可以要求其应用使用这种设定。用户也可以在设置中来豁免某些应用。 - App Link
- 全称为应用程序链接。
- 技术点:就是我们的隐式启动Intent。
- Android更加鼓励应用程序间的关联而不再是单一的应用同浏览器的交互。
- 指纹识别
- 6.0 以前一直由各个手机制造厂商去研发。导致指纹识别不同的手机差异巨大。
- 6.0 以后由Android系统提供API,硬件厂商只需提供相应的硬件支持即可。
- 应用权限管理
- 5.0 以前,只需要在manifest.xml中注册声明即可。
- 5.0 以后,用户可以在安装的时候关闭某些权限。
- 6.0 及以后,对于一些用户隐私权限总是会在第一次提示用户是否授予权限。
权限机制详解
- 优势
- 新的权限机制更好的保护了用户的隐私。
- 给了程序向用户说明权限的作用。
- 可以防止一些恶意程序盗取用户或者手机信息,增强了Android系统的安全性。
- 分类
- Normal Premission
- Dangerous Permission & Dangerous Premission Group
- 概念
如果你申请某个危险的权限,假设你的app早已被用户授权了同一组的某个危险权限,那么系统会立即授权,而不需要用户去点击授权。 - 新增API
- ContextCompact.checkSelfPermission( 检查当前APP是否具有某个权限)
- ActivityCompact.requestPermissions()(如果没有某个权限,就使用此方法申请权限,由于ActivityCompact是继承自ContextCompact,所以也可以用ActivityCompact)
- onRequestPermissionsResult()(申请权限是异步的,这是个回调来处理用户选择的结果,如果用户同意给权限,紧接着做授权成功的处理,若用户不同意授权,做授权失败的处理)
- ActivityCompact.shouldShowRequestPermissionRationale(给用户解释此权限的用途,在用户拒绝授权才会出现)
- 使用流程
- 在AndroidManifest中添加需要的权限(不可省,还要适配6.0以下的系统)
- 检查权限(检测危险权限)
- 申请授权
- 处理权限申请回调
- Dangerous Permissions (危险权限都是一组一组的,如果申请某个危险的权限,假设app早已被用户授权了同一组的某个危险权限,那么系统会立即授权,而不需要用户去点击授权,注意,不要对权限组过多的依赖,尽可能对每个危险权限都进行正常流程的申请,因为谁知道后期的版本中这个权限组会不会发生点变化呢)
- group:android.permission-group.CONTACTS
- permission:android.permission.WRITE_CONTACTS
- permission:android.permission.GET_ACCOUNTS
- permission:android.permission.READ_CONTACTS
- group:android.permission-group.CONTACTS
- group:android.permission-group.PHONE
- permission:android.permission.READ_CALL_LOG
- permission:android.permission.READ_PHONE_STATE
- permission:android.permission.CALL_PHONE
- permission:android.permission.WRITE_CALL_LOG
- permission:android.permission.USE_SIP
- permission:android.permission.PROCESS_OUTGOING_CALLS
- permission:com.android.voicemail.permission.ADD_VOICEMAIL
- group:android.permission-group.CALENDAR
- permission:android.permission.READ_CALENDAR
- permission:android.permission.WRITE_CALENDAR
- group:android.permission-group.CAMERA
- permission:android.permission.CAMERA
- group:android.permission-group.SENSORS
- permission:android.permission.BODY_SENSORS
- group:android.permission-group.LOCATION
- permission:android.permission.ACCESS_FINE_LOCATION
- permission:android.permission.ACCESS_COARSE_LOCATION
- group:android.permission-group.STORAGE
- permission:android.permission.READ_EXTERNAL_STORAGE
- permission:android.permission.WRITE_EXTERNAL_STORAGE
- group:android.permission-group.MICROPHONE
- permission:android.permission.RECORD_AUDIO
- group:android.permission-group.SMS
- permission:android.permission.READ_SMS
- permission:android.permission.RECEIVE_WAP_PUSH
- permission:android.permission.RECEIVE_MMS
- permission:android.permission.RECEIVE_SMS
- permission:android.permission.SEND_SMS
- permission:android.permission.READ_CELL_BROADCASTS
- 代码实践
只要按照使用流程去在代码中请求权限,就能解决6.0手机权限问题,只是在真正项目中每个危险权限一个个去请求,代码重复性就比较高,于是就需要对此进行一次封装,Github上面有不少封装好的权限请求,使用方法就到每个链接去看吧,很简单的,当然也可以自己在自己项目中封装啦。
- MPermissions a easy API to use runtime permission for Android M
- PermissionGen Android API easy to use permission for Android M
- RxPermissions Android runtime permissions powered by RxJava
还有一篇写的很好的博客介绍运行权限的 Android 6.0运行时权限详解