背景:
Android6.0称为Marshmallow(棉花糖),在2015年5月28日Google的I/O大会上首次露面,十月份正式发布并推送,至今已经一年多的时间了,所占市场份额在4.7%左右,更新了比较多的模块,当然主要是对Android系统进行了优化,对于我们开发者来说主要是应用权限的管理。
主要更新内容:
电源管理:
继在5.0中加入了节电模式之后,Google在原有的电源管理的基础上加入了两种新的状态:
- App Standby-应用待机状态
当系统检测到设备不充电,且用户没有直接或间接启动该应用时,该应用进入应用待机状态,而反之(当应用被激活或者设备在充电时)系统将该应用移出应用待机状态。
App Standby指的是系统会自动停用那些许久不用的应用,从而达到节省电量和减少后台占用的作用。
- Doze-系统休眠状态
当系统检测到设备不充电,且设备静止灭屏一段时间会进入休眠状态,而如此周期性检测,状态不改变则会进入更长的休眠状态,一直到进入饱和休眠状态。
Doze 的原理是通过对传感器的监控,来判断机器是否处于使用状态。当 Doze 认为机器长时间处于待机状态的时候,它会自动暂停绝大部分后台应用,同时关闭网络连接,仅在需要时偶尔连接,如此来达到在待机时节省电量的效果。
从这张图我们可以看到,系统进入Doze模式后,系统会隔一段时间处理正在挂起的任务,随着时间推移,后面间隔的时间会越来越长,以此来减少电量消耗。
App Links (App深链接):
谷歌在Android 6.0上新加入App Links,允许开发者将App和Web站点关联。这一举措旨在鼓励应用程序间关联,弱化浏览器的使用。比如说用户点击淘宝某件商品的链接,在用户安装了淘宝APP的情况下优先考虑跳转到淘宝APP。
指纹识别:
在6.0以前的指纹识别是各家手机厂商自己研发,弊端在于加剧了Android系统的碎片化,而且各家厂商的指纹识别也是良莠不齐,6.0以后谷歌为Android提供指纹识别API,厂商只需要提供硬件支持即可。
Android Pay:
新的6.0系统中集成了Android Pay。其特性在于简洁、安全、可选性。Android Pay是一个开放性平台,使用户就可以选择谷歌的服务或者使用银行的APP来使用它,Android Pay向下兼容到Android 4.4,同时支付功能可以使用指纹来进行支付,但事实上各家厂商并不买账。
应用权限管理:
关于应用权限的问题,一直是Android 系统被人所诟病的一点,存在了很大的安全漏洞。一直以来如果 Android 用户不想让某些 App 读取地理信息数据或者访问通讯录,只能靠第三方软件或者第三方 ROM 的内置功能来实现,而且在使用的时候可能需要 Root 权限等,极为麻烦,而谷歌显然是意识到了这点,首先看下Android 系统的权限模型变化:
- 5.0以前,只需要在Manifest清单文件中注册声明即可永久使用;
- 5.0以后,用户在安装时可以选择关闭某些权限;
- 6.0以后,权限类型划分,对于一些危险或隐私权限会让用户选择是否授权;
Android6.0对权限进行了分类,具体可分为:
- Normal Premission:普通权限
- Dangerous Permission/Group: 危险权限/组
普通权限,跟之前一样只需要在AndroidManifest.xml中申请即可,而对于危险权限,则是需要单独跟用户申请的权限(运行时权限)。
以下是普通权限,只需要在AndroidManifest.xml中申请即可:
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
android.permission.ACCESS_NETWORK_STATE
android.permission.ACCESS_NOTIFICATION_POLICY
android.permission.ACCESS_WIFI_STATE
android.permission.ACCESS_WIMAX_STATE
android.permission.BLUETOOTH
android.permission.BLUETOOTH_ADMIN
android.permission.BROADCAST_STICKY
android.permission.CHANGE_NETWORK_STATE
android.permission.CHANGE_WIFI_MULTICAST_STATE
android.permission.CHANGE_WIFI_STATE
android.permission.CHANGE_WIMAX_STATE
android.permission.DISABLE_KEYGUARD
android.permission.EXPAND_STATUS_BAR
android.permission.FLASHLIGHT
android.permission.GET_ACCOUNTS
android.permission.GET_PACKAGE_SIZE
android.permission.INTERNET
android.permission.KILL_BACKGROUND_PROCESSES
android.permission.MODIFY_AUDIO_SETTINGS
android.permission.NFC
android.permission.READ_SYNC_SETTINGS
android.permission.READ_SYNC_STATS
android.permission.RECEIVE_BOOT_COMPLETED
android.permission.REORDER_TASKS
android.permission.REQUEST_INSTALL_PACKAGES
android.permission.SET_TIME_ZONE
android.permission.SET_WALLPAPER
android.permission.SET_WALLPAPER_HINTS
android.permission.SUBSCRIBED_FEEDS_READ
android.permission.TRANSMIT_IR
android.permission.USE_FINGERPRINT
android.permission.VIBRATE
android.permission.WAKE_LOCK
android.permission.WRITE_SYNC_SETTINGS
com.android.alarm.permission.SET_ALARM
com.android.launcher.permission.INSTALL_SHORTCUT
com.android.launcher.permission.UNINSTALL_SHORTCUT
以下是危险权限,需单独申请,共分为9组(危险权限组),每组只要有一个权限申请成功了,就默认整组权限都可以使用了。
group:android.permission-group.CONTACTS
permission:android.permission.WRITE_CONTACTS
permission:android.permission.GET_ACCOUNTS
permission:android.permission.READ_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
申请步骤:
- 将targetSdkVersion设置为23,注意,如果你将targetSdkVersion设置为>=23,则必须按照Android谷歌的要求,动态的申请权限,如果你暂时不打算支持动态权限申请,则targetSdkVersion最大只能设置为22。
- 在AndroidManifest.xml中申请你需要的权限,包括普通权限和需要申请的特殊权限,这样做是为了兼容6.0以下的版本
- 申请权限,此处分为3步:
- 检查是否由此权限checkSelfPermission(),如果已经开启,则不需要再申请。
- 如果未开启,则判断是否需要向用户解释为何申请权限shouldShowRequestPermissionRationale。
- 如果需要(即返回true),则可以弹出对话框提示用户申请权限原因,用户确认后申请权限requestPermissions(),如果不需要(即返回false),则直接申请权限requestPermissions()。