Android从5.0到9.0版本的主要变更

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

官方文档

推荐阅读更多精彩内容