Android 不同版本之间的 Api 重要变化
Android 不同版本之间的 Api 重要变化
KitKat(4.4)
1.外部存储空间读取
您的应用在 Android 4.4 上运行时无法读取外部存储空间上的共享文件,除非您的应用具有
READ_EXTERNAL_STORAGE
权限。也就是说,没有此权限,您无法再访问getExternalStoragePublicDirectory()
返回的目录中的文件。但是,如果您仅需要访问getExternalFilesDir()
提供的您的应用特有目录,那么,您不需要READ_EXTERNAL_STORAGE
权限
2.使用 AlarmManager
将您的应用的
targetSdkVersion
设置为“19”或更高版本时,您使用set()
或setRepeating()
创建的闹铃将变得不准确。
为提高电源效率,Android 现在批处理在合理的相似时间发生的所有应用的闹铃,以便系统仅唤醒设备一次,而不是多次唤醒设备来处理每个闹铃。
如果您的闹铃没有与精确的时钟时间关联,但您的闹铃仍必须在特定时间范围(例如,在下午 2 点至 4 点之间)触发,那么您可以使用新的
setWindow()
方法,其接受闹铃的“最早”时间以及最早时间之后的一个时间“窗口”,在这个窗口内,系统应触发闹铃。
如果您的闹铃必须固定到一个精确的时钟时间(例如,日历事件提醒),那么您可以使用新的
setExact()
方法。
这个精确的批处理行为仅适用于更新后的应用。如果您已将 targetSdkVersion 设置为“18”或更低版本,那么在 Android 4.4 上运行时,您的闹铃的行为方式和在以前版本上一样。
3.沉浸式全屏模式
要为您的应用提供填充整个屏幕的布局,适用于
setSystemUiVisibility()
的新标记SYSTEM_UI_FLAG_IMMERSIVE
(与SYSTEM_UI_FLAG_HIDE_NAVIGATION
结合使用时)将启用新的沉浸式全屏模式。在启用沉浸式全屏模式后,您的 Activity 将继续接收所有触摸事件。用户可以沿着系统状态栏正常出现的区域向内滑动来显示系统状态栏。这将清除SYSTEM_UI_FLAG_HIDE_NAVIGATION
标记(如果应用了SYSTEM_UI_FLAG_FULLSCREEN
标记,也会清除该标记),因此系统状态栏保持可见状态。但是,如果您想要系统状态栏在片刻后再次隐藏,可以改用SYSTEM_UI_FLAG_IMMERSIVE_STICKY
标记。
4.透明系统状态栏
现在,您可以使用新主题背景
Theme.Holo.NoActionBar.TranslucentDecor
和Theme.Holo.Light.NoActionBar.TranslucentDecor
将系统状态栏设置为部分透明。通过启用透明系统状态栏,您的布局将填充系统状态栏后面的区域,因此,您也必须为不应被系统状态栏覆盖的布局部分启用fitsSystemWindows
。
如果您要创建自定义主题背景,则将其中某个主题背景设置为父主题背景,或在您的主题背景中添加
windowTranslucentNavigation
和windowTranslucentStatus
样式属性。
Lollipop
1.Material Design 支持
- Material Design 主题
- 视图阴影
- RecyclerView 小部件
- 可绘制动画和造型效果
- Material Design 动画和 Activity 转换效果
- 针对基于视图状态的视图属性的动画生成器
- 可自定义的 UI 小部件和具有可由您控制的调色板的应用栏
- 基于 XML 矢量图形的动画和非动画可绘制对象
2.计划排定作业
Android 5.0 新增了一个 JobScheduler API,允许您定义一些系统在稍后或指定条件下(如设备充电时)以异步方式运行的作业,从而优化电池寿命。下列情形下,作业计划排定功能很有用:
- 应用具有不面向用户并且可以推迟的作业
- 应用具有您更愿意在设备插入电源时再进行的作业
- 应用具有一项需要接入网络或连接 WLAN 的任务。
- 应用具有多项您希望定期以批处理方式运行的任务。
- 一个作业单位由一个 JobInfo 对象封装。该对象指定计划排定标准。
使用 JobInfo.Builder 类可配置应如何运行已排计划的任务。您可以安排任务在特定条件下运行,例如:
- 在设备充电时启动
- 在设备连入无限流量网络时启动
- 在设备空闲时启动
- 在特定期限前或以最低延迟完成
例如,您可以添加一段如下代码,在无限流量网络上运行您的任务:
JobInfo uploadTask = new JobInfo.Builder(mJobId,
mServiceComponent /* JobService component */)
.setRequiredNetworkCapabilities(JobInfo.NetworkType.UNMETERED)
.build();
JobScheduler jobScheduler =
(JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(uploadTask);