Android从5.0到9.0版本的主要变更
https://www.jianshu.com/p/10bdbf883c46?utm_source=desktop&utm_medium=timeline
Android5.0
1.虚拟机
在 Android 5.0 中,全面由Dalvik转用ART(Android Runtime)编译。大大提高了性能。
- 预先 (AOT) 编译
- 改进的垃圾回收 (GC)
- 改进的调试支持
2.Material Design 样式
采用全新Material Design设计,页面更加的美观,立体。
3.浮动通知
设备未锁定且其屏幕处于打开状态,通知可以显示在小型浮动窗口中,称为浮动通知。
4.绑定服务
启动或绑定服务必须显式启动,如果隐式启动,会引发下列异常:
 Caused by: java.lang.IllegalArgumentException: Service Intent must be explicit
如果非要隐式启动,可以使用下列方案来避免异常:
val intent = Intent("Service对应的Action")
intent.`package` = packageName
bindService(intent,mServiceConnection,BIND_AUTO_CREATE)
Android6.0
1.运行时权限
用户可直接在运行时管理应用权限。这种模式让用户能够更好地了解和控制权限,同时为应用开发者精简了安装和自动更新过程。用户可为所安装的各个应用分别授予或撤销权限。
//检测某个权限是否已经被授予
//PackageManager.PERMISSION_GRANTE:获得权限
//PackageManager.PERMISSION_DENIED:为获得权限
ContextCompat.checkSelfPermission(Context context,String permission)
//申请权限
ActivityCompat.requestPermissions(Activity activity,String[] permissions, int requestCode)
//处理授权
onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults)
//解释说明权限的用途
ActivityCompat.shouldShowRequestPermissionRationale(Activity activity,String permission)
2.低电耗模式和应用待机模式
- 低电耗模式:如果用户拔下设备的电源插头,并在屏幕关闭后的一段时间内使其保持不活动状态,设备会进入 - 低电耗模式。 在该模式下设备会尝试让- 系统保持休眠状态。在该模式下,设备会定期短时间恢复正常工作,以便进行应用同步,- 还可让系统执行任何挂起的操作。
- 应用待机模式:应用待机模式允许系统判定应用在用户未主动使用它时处于空闲状态。当用户有一段时间未触摸应用时,系统便会作出此判定。如果拔下了设备电源插头,系统会为其视为空闲的应用 - 停用网络访问以及暂停同步和作业。
在低电耗模式下,您的应用会受到以下限制:
- 暂停访问网络
- 系统忽略唤醒锁定
- 标准AlarmManager闹钟推迟到下一个维护期
- 系统不执行WLAN扫描
- 系统不允许运行同步适配器SyncAdapter
- 系统不允许运行JobScheduler
3.取消支持 Apache HTTP
Android 6.0版移除了对 Apache HTTP 的支持,推荐使用HttpURLConnection,因为它可以通过透明压缩和响应缓存减少网络使用,并可最大限度降低耗电量。
如果想继续使用Apache HTTP,必须先在build.gradle文件中如下声明:
android {
    useLibrary 'org.apache.http.legacy'
}
Android7.0
1.文件访问权限
为了提高私有文件的安全性,应用私有目录被限制访问,此设置可防止私有文件的元数据泄漏,如它们的大小或存在性。
- 无法使用file://这样的形式访问文件,不然会报错FileUriExposedException,现在改用FileProvide来访问文件。
<manifest>
    ...
    <application>
        ...
        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="com.mydomain.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
           <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>
        ...
    </application>
</manifest>
file_paths.xml文件内容:
<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <paths>
        <files-path path="files" name="files" />
        <cache-path path="files" name="cache" />
        ...
    </paths>
</resources>
- path:文件夹“相对路径”
- name:名称标志字符,不能重名。
| 标签 | 路径 | 
|---|---|
| files-path | getFilesDir() | 
| cache-path | getCacheDir() | 
| external-path | Environment.getExternalStorageDirectory() | 
| external-files-path | getExternalFilesDir() | 
| external-cache-path | getExternalCacheDir() | 
| external-media-path | getExternalMediaDirs() | 
| root-path | / | 
<files-path path="image" name="files" />:对应的文件路径为:getFilesDir() / image/
- DownloadManager不再按文件名分享私人存储的文件。
2.移除三项隐式广播
- CONNECTIVITY_ACTION:网络状态监听。
- ACTION_NEW_PICTURE:拍照广播
- ACTION_NEW_VIDEO:录视频广播
注意:移除的是
隐式广播。正在前台运行的应用程序如果在主线程中动态注册了该广播,该应用程序仍然可以接收到该广播。
3.进一步优化低电耗模式
Android 6.0引入了低电耗模式,当用户设备未插接电源、处于静止状态且屏幕关闭时,该模式会推迟 CPU和网络活动,从而延长电池寿命。而Android 7.0则通过在设备未插接电源且屏幕关闭状态下、但不一定要处于静止状态(例如用户外出时把手持式设备装在口袋里)时应用部分CPU和网络限制,进一步增强了低电耗模式。
Android8.0
1.后台执行限制
- 在后台运行的应用对后台服务的访问受到限制。
- 应用无法使用其清单注册大部分隐式广播。
如果在后台服务中调用startService(),则会抛出IllegalStateException。 调用Context.startForegroundService()将启动一个前台服务。即使应用在后台运行,系统也允许其调用 Context.startForegroundService()。不过,应用必须在创建服务后的五秒内调用该服务的startForeground()。
2.后台位置限制
为节约电池电量、保持良好的用户体验和确保系统健康运行,在运行Android 8.0的设备上使用后台应用时,降低了后台应用接收位置更新的频率。此行为变更会影响包括Google Play服务在内的所有接收位置更新的应用。
影响的API:
- Fused Location Provider (FLP)
- Geofencing
- GNSS Measurements
- Location Manager
- Wi-Fi Manager
3.通知

在Android 8.0中,我们已重新设计通知,以便为管理通知行为和设置提供更轻松和更统一的方式。这些变更包括以下内容:
- 通知渠道:Android 8.0引入了通知渠道,其允许您为要显示的每种通知类型创建用户可自定义的渠道。用户界面将通知渠道称之为通知类别。
从Android 8.0(API 级别 26)开始,必须为所有通知分配渠道,否则通知将不会显示。通过将通知归类为不同的
渠道,用户可以停用您应用的特定通知渠道(而非停用您的所有通知),还可以控制每个渠道的视觉和听觉选项。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    //创建通知渠道
    val name = getString(R.string.channel_name)
    val descriptionText = getString(R.string.channel_description)
    val importance = NotificationManager.IMPORTANCE_DEFAULT
    val mChannel = NotificationChannel(CHANNEL_ID, name, importance)
    mChannel.description = descriptionText
    //注册渠道
    val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
    notificationManager.createNotificationChannel(mChannel)
}
- 通知标志:Android 8.0引入了对在应用启动器图标上显示通知标志的支持。通知标志可反映某个应用是否存在与其关联、并且用户尚未予以清除也未对其采取行动的通知。通知标志也称为通知点(强迫症非常讨厌的东西)。
- 背景颜色:您现在可以设置和启用通知的背景颜色。只能在用户必须一眼就能看到的持续任务的通知中使用此功能。例如,您可以为与驾车路线或正在进行的通话有关的通知设置背景颜色。
- 消息样式:使用MessagingStyle类的通知可在其折叠形式中显示更多内容。对于与消息有关的通知,您应使用MessagingStyle类。您还可以使用新的addHistoricMessage(),通过向与消息相关的通知添加历史消息为会话提供上下文。
- 通知清除:系统现在可区分通知是由用户清除,还是由应用移除。通过NotificationListenerService类的onNotificationRemoved()。
- 休眠:用户可以将通知置于休眠状态,以便稍后重新显示它。重新显示时通知的重要程度与首次显示时相同。应用可以移除或更新已休眠的通知,但更新休眠的通知并不会使其重新显示。
- 通知超时:使用setTimeoutAfter()创建通知时您可以设置超时。您可以使用此函数指定一个持续时间,超过该持续时间后,通知应取消。如果需要,您可以在指定的超时持续时间之前取消通知。
4.自适应图标
Android 8.0(API 级别 26)引入了自适应启动器图标,它可以在不同设备型号上显示为不同的形状。例如,在一台原始设备制造商 (OEM) 设备上,自适应启动器图标可显示为圆形,而在其他设备上则可显示为方圆形。每个设备的原始设备制造商 (OEM) 都会提供一个蒙版,系统使用该蒙版渲染所有具有相同形状的自适应图标。自适应启动器图标还会在快捷方式、“设置”应用、共享对话框和概览屏幕中使用。

Android9.0
1.电源管理
- 应用待机群组:系统将根据用户的使用模式限制应用对 CPU 或电池等设备资源的访问。
- 省电模式改进:开启省电模式后,系统会对所有应用施加限制。 这是一项已有的功能,但在Android 9中得到了改进。
2.隐私权变更
后台对传感器的访问受限:Android 9限制后台应用访问用户输入和传感器数据的能力。 如果您的应用在运行 Android 9设备的后台运行,系统将对您的应用采取以下限制:
如果需要在运行
Android 9的设备上检测传感器事件,请使用前台服务。
限制访问通话记录:Android 9引入CALL_LOG权限组并将READ_CALL_LOG、WRITE_CALL_LOG和PROCESS_OUTGOING_CALLS权限移入该组。 在之前的Android版本中,这些权限位于PHONE权限组。
如果您的应用需要访问通话记录或者需要处理去电,则您必须向CALL_LOG权限组明确请求这些权限。 否则会发生SecurityException。
3.对使用非 SDK 接口的限制
为帮助确保应用稳定性和兼容性,此平台对某些非SDK函数和字段的使用进行了限制;无论您是直接访问这些函数和字段,还是通过反射或 JNI 访问,这些限制均适用。 在 Android 9 中,您的应用可以继续访问这些受限的接口;该平台通过 toast 和日志条目提醒您注意这些接口。 如果您的应用显示这样的 toast,则必须寻求受限接口之外的其他实现策略。
4.框架安全性变更
默认启用网络传输层安全协议 (TLS):默认使用https,会阻止http请求,如果想继续使用http可以在清单文件中做如下配置:
<application
     ...
     android:usesCleartextTraffic="true">
...
</application>
5.Apache HTTP弃用
在Android 6.0 中,我们移除了对 Apache HTTP的支持。从· Android 9 开始·,该内容库已从 bootclasspath中移除,且默认情况下应用无法使用它。要继续使用Apache HTTP,以Android 9及更高版本为目标平台的应用可以向其 AndroidManifest.xml添加以下内容:
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
6.前台服务
如果应用以Android 9或更高版本为目标平台并使用前台服务,则必须请求FOREGROUND_SERVICE权限。这是普通权限,因此,系统会自动为请求权限的应用授予此权限。
如果以Android 9或更高版本为目标平台的应用尝试创建前台服务且未请求FOREGROUND_SERVICE,则系统会抛出SecurityException。
KotlinAndroid
EShop
官方文档
作者:慕涵盛华
链接:https://www.jianshu.com/p/10bdbf883c46
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Android从5.0到9.0版本的主要变更的更多相关文章
- [Android]Android端ORM框架——RapidORM(v2.0)
		以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5626716.html [Android]Android端ORM ... 
- 【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)
		分类: Android 系统开发(5) 作者同类文章X 版权声明:本文为博主原创文章 ... 
- 关于The specified Android SDK Build Tools version (26.0.2) is ignored, as it is below the minimum...
		今天将项目迁移到另一台笔记本,进行build出现以下问题,导致build失败 The specified Android SDK Build Tools version (26.0.2) is ign ... 
- Android app 在线更新那点事儿(适配Android6.0、7.0、8.0)
		一.前言 app在线更新是一个比较常见需求,新版本发布时,用户进入我们的app,就会弹出更新提示框,第一时间更新新版本app.在线更新分为以下几个步骤: 1, 通过接口获取线上版本号,versionC ... 
- Eclipse编译Android项目时出现的问题:Android requires compiler compliance level 5.0 or 6.0. Found '1.8' instead.
		Consle: Android requires compiler compliance level 5.0 or 6.0. Found '1.8' instead. Please use Andro ... 
- [RK3288][Android6.0] 调试笔记 --- user版本默认显示开发者选项【转】
		本文转载自:https://blog.csdn.net/kris_fei/article/details/70157137 Platform: ROCKCHIPOS: Android 6.0Kerne ... 
- Android 升级安装APK兼容Android7.0,解决FileUriExposedException
		我们在开发app时避免不了需要添加应用内升级功能.当app启动时,如果检测到最新版本,将apk安装包从服务器下载下来,执行安装.安装apk的代码一般写法如下,网上随处可以搜到 public stati ... 
- Android 基于ijkplayer+Rxjava+Rxandroid+Retrofit2.0+MVP+Material Design的android万能播放器aaa
		MDPlayer万能播放器 MDPlayer,基于ijkplayer+Rxjava+Rxandroid+Retrofit2.0+MVP+Material Design的android万能播放器,可以播 ... 
- 解决AS加载gradle时出现的Could not find com.android.tools.build:gradle:3.5.0.的错误
		时间:2019/12/7 最近在做安卓大作业时总是遇到从GitHub上下载下来的demo不能在本地Android studio中运行的问题,感觉真的被安卓中的各种版本给恶心到了,下面记录其中比较典型的 ... 
- Android requires compiler compliance level 5.0 or 6.0. Found '1.4' instead的解决办法
		今天在导入工程进Eclipse的时候竟然出错了,控制台输出的是: [2013-02-04 22:17:13 - takepicture] Android requires compiler compl ... 
随机推荐
- zabbix Server 4.0 触发器(Trigger)篇
			zabbix Server 4.0 触发器(Trigger)篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.触发器(Trigger)概述 1>.上一篇博客我们介绍了“内 ... 
- MongoDB的关闭
			关闭 1,非后台运行时,关闭对话,或者ctrl+c 2,登录数据库执行:db.shutdownServer(); 3,带数据目录,关闭服务器,安全 mongod --shutdown --dbpa ... 
- abp学习(一)
			官网概念 ASP.NET样板是特别设计的新的现代Web应用程序的通用应用框架.它使用已经熟悉的工具并围绕这些工具实现最佳实践,从而为您提供一致的开发体验. 官网地址:https://aspnetboi ... 
- nginx 配置文件详解(转)
			#运行用户 #user nobody; #启动进程,通常设置成和cpu的数量相等或者2倍于cpu的个数(具体结合cpu和内存).默认为1 worker_processes 1; #全局的错误日志和日志 ... 
- 开发指南~小程序代码构成~JSON配置
			2.1 JSON 配置 JSON 是一种数据格式,并不是编程语言,在小程序中,JSON扮演的静态配置的角色. 2.1.1 一个例子 先看一个例子,打开开发工具的编辑器,在根目录下可以找到 app.j ... 
- P2018 消息传递[dp]
			题目描述 巴蜀国的社会等级森严,除了国王之外,每个人均有且只有一个直接上级,当然国王没有上级.如果A是B的上级,B是C的上级,那么A就是C的上级.绝对不会出现这样的关系:A是B的上级,B也是A的上级. ... 
- 使用VISIO绘制组织结构图的操作方法
			1.确保电脑已安装VISIO软件,然后在电脑指定位置点击鼠标右键新建VISIO绘图文档. 2.打开文档,在弹出的选择绘图类型中点击商务.组织结构图,之后点击确定. 3.之后进入绘图主界面,在左侧是形状 ... 
- Linux中修改环境变量
			<1>Linux 的变量作用范围可分为两类:环境变量和本地变量 环境变量,或者称为全局变量,存在与所有的shell 中,在你登陆系统的时候就已经有了相应的系统定义的环境变量了.Linux ... 
- mage Ansible学习3 ansible role实例
			一.ansible配置文件解析 1./etc/ansible/ansible.cfg配置文件详解 [root@node3 ~]# cat /etc/ansible/ansible.cfg |grep ... 
- 019_Python3 输入和输出
			在前面几个章节中,我们其实已经接触了 Python 的输入输出的功能.本章节我们将具体介绍 Python 的输入输出. ************************************ 1 ... 
