Android在版本迭代中,总会进行很多改动,下面我们一起梳理下。
Android 4.4
- 发布ART虚拟机,提供开启选项
- HttpURLConnection的底层实现替换成OkHttp
Android 5.0
- ART成为默认虚拟机,完全替代Dalvik虚拟机
Context.bindService()方法需要显式 Intent,如果提供隐式 intent,将引发异常。
Android 6.0
- 增加运行时权限限制
如果你的应用使用到了危险权限,比如在运行时进行检查和请求权限。checkSelfPermission()方法用于检查权限,requestPermissions() 方法用于请求权限。
- 取消支持Apache HTTP
Android 6.0 版移除了对 Apache HTTP相关类库的支持。要继续使用 Apache HTTP API,您必须先在 build.gradle 文件中声明以下编译时依赖项:
android {useLibrary 'org.apache.http.legacy'}
Android 7.0
- Android 7.0 引入一项新的应用签名方案 APK Signature Scheme v2
- Toast导致的BadTokenException
- 在Android7.0系统上,Android 框架强制执行了 StrictMode API 政策禁止向你的应用外公开 file:// URI。如果一项包含文件 file:// URI类型 的 Intent 离开你的应用,应用失败,并出现
FileUriExposedException异常,如调用系统相机拍照录制视频,或裁切照片。
这一点其实就是限制了在应用间共享文件,如果需要在应用间共享,需要授予要访问的URI临时访问权限,我们要做的就是注册FileProvider:
1.声明FileProvider。
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="app的包名.fileProvider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
<!--androidx版本类路径为:androidx.core.content.FileProvider-->
2.编写xml文件,确定可访问的目录
<paths xmlns:android="http://schemas.android.com/apk/res/android">
//代表设备的根目录new File("/");
<root-path name="root" path="." />
//context.getFilesDir()
<files-path name="files" path="." />
//context.getCacheDir()
<cache-path name="cache" path="." />
//Environment.getExternalStorageDirectory()
<external-path name="external" path="." />
//context.getExternalFilesDirs()
<external-files-path name="name" path="path" />
//getExternalCacheDirs()
<external-cache-path name="name" path="path" />
</paths>
3.使用FileProvider
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Uri uri = FileProvider.getUriForFile(CameraActivity.this, "app的包名.fileProvider", photoFile);
} else {
Uri uri = Uri.fromFile(photoFile);
}
Android 8.0
- 修改运行时权限错误
在 Android 8.0 之前,如果应用在运行时请求权限并且被授予该权限,系统会错误地将属于同一权限组并且在清单中注册的其他权限也一起授予应用。对于针对 Android 8.0 的应用,系统只会授予应用明确请求的权限。然而,一旦用户为应用授予某个权限,则所有后续对该权限组中权限的请求都将被自动批准。也就是说,以前你申请了READ_EXTERNAL_STORAGE权限,应用会同时给你授予同权限组的WRITE_EXTERNAL_STORAGE权限。如果Android8.0以上,只会给你授予你请求的READ_EXTERNAL_STORAGE权限。如果需要WRITE_EXTERNAL_STORAGE权限,还要单独申请,不过系统会立即授予,不会提示。
- 修改通知
Android 8.0 对于通知修改了很多,比如通知渠道、通知标志、通知超时、背景颜色。其中比较重要的就是通知渠道,其允许您为要显示的每种通知类型创建用户可自定义的渠道。这样的好处就是对于某个应用可以把权限分成很多类,用户来控制是否显示哪些类别的通知。而开发者要做的就是必须设置这个渠道id,否则通知可能会失效。
private void createNotificationChannel() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationManager notificationManager = (NotificationManager)
getSystemService(Context.NOTIFICATION_SERVICE);

本文梳理了Android从4.4到11的主要版本变更,包括ART虚拟机、权限管理、通知渠道、文件访问、媒体文件权限、多媒体Intent限制、5G API等关键更新。针对每个版本,详细介绍了开发者需要关注的适配要点,帮助理解如何应对版本迭代带来的挑战。
最低0.47元/天 解锁文章
497

被折叠的 条评论
为什么被折叠?



