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 ...
随机推荐
- Linux命令——df
参考:12 Useful “df” Commands to Check Disk Space in Linux 简介 df用于查看文件系统磁盘空间使用情况. df 读取的数据几乎都是针对一整个文件系统 ...
- react native jpush
原文链接:https://blog.csdn.net/qq_38719039/article/details/80684144 1 npm install jpush-react-native --s ...
- P1903 [国家集训队]数颜色 / 维护队列(带修莫队)
题目描述: 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. ...
- 《CoderXiaoban》第九次团队作业:Beta冲刺与验收准备3
项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 实验十三 团队作业9:BETA冲刺与团队项目验收 团队名称 Coderxiaoban团队 作业学习目标 (1)掌握软件黑盒 ...
- 《BUG创造队》作业9:【Beta】冲刺 Scrum meeting 3
项目 内容 这个作业属于哪个课程 2016级软件工程 这个作业的要求在哪里 实验十三 团队作业9:Beta冲刺与团队项目验收 团队名称 BUG创造队 作业学习目标 (1)掌握软件黑盒测试技术:(2)学 ...
- java中List与数组的转换
1.数组转换成List public static <T> List<T> asList(T... a) String[] arr = new String[] {" ...
- SQL 语句中关于 NULL 的那些坑
问题描述 今天在跟进公司内部测试平台线上问题的时候,发现一个忽略已久的问题. 为了简化问题描述,将其进行了抽象. 有一张数据表qms_branch,里面包含了一批形式如下所示的数据: id name ...
- 查看mysql日志文件
开启mysql日志 /etc/mysql/mysql.conf.d/mysqld.cnf sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf 找到第68,69行 前面 ...
- 多线程执行sql报错处理
pymysql多线程访问数据库报错:Packet sequence number wrong - got 7 expected 2 原文:https://www.cnblogs.com/heiao10 ...
- Spark设置自定义的InputFormat读取HDFS文件
本文通过MetaWeblog自动发布,原文及更新链接:https://extendswind.top/posts/technical/problem_spark_reading_hdfs_serial ...