1.Android 3步搞定事件分发机制,再也不用担心onTouch和onTouchEvent&dispatchTouchEvent
https://blog.csdn.net/WHB20081815/article/details/62888575
2.Android 滑动冲突的完美解决方案 listview和scroView
https://blog.csdn.net/WHB20081815/article/details/88617041
3.Android 深入理解 View 的绘制流程和机制
https://blog.csdn.net/WHB20081815/article/details/62236641
4.Android 5.0 6.0 以及7.0新特性 MD风格 敏感权限 文件访问
https://blog.csdn.net/WHB20081815/article/details/70244065
5.Android 万能适配方案和UI屏幕适配 不同分辨率 最全面 最易懂的
https://blog.csdn.net/WHB20081815/article/details/76937801
6.Android 2分钟刷Android 8.0系统 和 8.0适配 完美方案
https://blog.csdn.net/WHB20081815/article/details/75669925
7.Android快速理解Activity、View及Window&WindowManager之间关系
https://blog.csdn.net/WHB20081815/article/details/62419059
本文将从以下3个方面详细介绍Anroid 8.0完美适配
1).快速刷Anroid 8.0系统
2).应用API的主要修改,源代码详解,值得注意的地方
3).Anroid O新特性,行为变更
一).2分钟刷新Android 8.0的系统
1. Google O 版本的 O正式版已经发布, O-preview 的 SDK 下载地址: https://android.googlesource.com/platform/external/selinux/+/android-o-preview-1
4.Google 源码托管地址:https://android.googlesource.com/platform/packages 需要翻墙才能用
5.API差异:https://developer.android.google.cn/sdk/api_diff/26/changes.html
6. Google O 版本的 O-正式版 source code 下载方法: <a href=""https://source.android.com/source/downloading.html">https://source.android.com/source/downloading.html
7. 目前 Nexus5X、Nexus6P、Nexus Player、Pixel C、Pixel、Pixel XL 可以升级 O 版本,
下载地址如下:https://developer.android.google.cn/preview/download.html#flashable-images
根据:opp4知道:是preview4,现在下载的最新版本是Android 8.0正式版本
最好采用的机器:Nexus6P:是谷歌系统,由华为代工
建议采购 Nexus6P手机做自验证,O 版本(不包括 O)以后,Nexus 设备将不会再支持 android 新系统。
Android 新系统都会 第一时间支持自家手机。 刷手机的方法:
刷机流程如下:刷机有风险,操作需谨慎
从下面地址下载对应的镜像压缩包和脚本。
https://developer.android.google.cn/preview/download.html#flashable-images
1.下载对应设备的压缩包并解压;
2.手机连上 USB 后,执行 adb reboot bootloader 命令;
3.等手机出现小机器人以后,并且显示‘unlock’字样时,执行压缩包中的 bat 脚本。
如果是‘lock‘字样:
1.连续点击设置-版本号 3 次,打开开发人员选项;
2.在开发人员选项中打开 OEM unlock;
3.连接手机到电脑,执行 adb reboot bootloader 命令到小机器人界面;
4.执行fastboot flashing unlock ,因为有些手机下面执行失败
5.执行 fastboot oem unlock,这样手机就解锁了,再使用上面的刷机方法即可。
刷机流程总结:解锁,下载镜像,执行脚本就OK了,只需要10分钟解决
没有 6P 等支持 O 版本的手机,怎么办?
A.可以使用华为终端开放实验室 OpenLab 云测试平台进行兼容性测试和远程调测。
平台介绍及使用说明:https://deveco.huawei.com/manualinstuction。
云测试平台: https://deveco.huawei.com,可以利用该平台选择 Nexus 6P 复现 O 版本的问题。
fastboot工具:Android studio里面自带了fastboot
刷机注意的问题:
1.机型和镜像系统要对应
变更的东西:
1. Google O 版本版本计划: https://developer.android.google.cn/preview/overview.html#timeline
2. Google O 版本主要行为变更: https://developer.android.google.cn/preview/behavior-changes.html#o-apps
需要重点关注 Background execution limits、Permissions 和 Security
二).Android 8.0系统的主要行为变更
分为俩部分,针对所有 API 级别的应用和针对 Android 8.0 的应用
针对所有 API 级别的应用,需要特别关注的如下几个重点
1)后台运行限制
Android 8.0 还对特定函数做出了以下变更:
- 如果针对 Android 8.0 的应用尝试在不允许其创建后台服务的情况下使用
startService()
函数,则该函数将引发一个IllegalStateException
。 - 新的
Context.startForegroundService()
函数将启动一个前台服务。现在,即使应用在后台运行,系统也允许其调用Context.startForegroundService()
。不过,应用必须在创建服务后的五秒内调用该服务的startForeground()
函数3).安全相关的变化
- 此平台不再支持 SSLv3。
- 在与未正确实现 TLS 协议版本协商的服务器建立 HTTPS 连接时,
HttpsURLConnection
不再尝试回退到之前的 TLS 协议版本并重试的权宜方法。 - Android 8.0 将使用安全计算 (SECCOMP) 过滤器来过滤所有应用。允许的系统调用列表仅限于通过 bionic 公开的系统调用。此外,还提供了其他几个后向兼容的系统调用,但我们不建议使用这些系统调用。
- 现在,您的应用的
WebView
对象将在多进程模式下运行。网页内容在独立的进程中处理,此进程与包含应用的进程相隔离,以提高安全性。
- 现在,您的应用的
3).隐私策略变化 AndroidID
- 对于在 OTA 之前安装到某个版本 Android 8.0(API 级别 26)的应用,除非在 OTA 后卸载并重新安装,否则
ANDROID_ID
的值将保持不变。要在 OTA 后在卸载期间保留值,开发者可以使用密钥/值备份关联旧值和新值。 - 对于安装在运行 Android 8.0 的设备上的应用,
ANDROID_ID
的值现在将根据应用签署密钥和用户确定作用域。应用签署密钥、用户和设备的每个组合都具有唯一的ANDROID_ID
值。因此,在相同设备上运行但具有不同签署密钥的应用将不会再看到相同的 Android ID(即使对于同一用户来说,也是如此)。 - 只要签署密钥相同(并且应用未在 OTA 之前安装到某个版本的 O),
ANDROID_ID
的值在软件包卸载或重新安装时就不会发生变化。 - 即使系统更新导致软件包签署密钥发生变化,
ANDROID_ID
的值也不会变化。要借助一个简单的标准系统实现应用获利,请使用广告 ID。广告 ID 是 Google Play 服务针对广告服务提供的唯一 ID,此 ID 可由用户重置。4
4).
4.记录未捕获的异常
如果某个应用安装的
Thread.UncaughtExceptionHandler
未移交给默认的Thread.UncaughtExceptionHandler
,则当出现未捕获的异常时,系统不会终止应用。从 Android 8.0 开始,在此情况下系统将记录异常堆栈跟踪情况;在之前的平台版本中,系统不会记录异常堆栈跟踪情况。我们建议,自定义
Thread.UncaughtExceptionHandler
实现始终移交给默认处理程序处理;遵循此建议的应用不受 Android 8.0 此项变更的影响。5.集合的处理
现在,
AbstractCollection.removeAll()
和AbstractCollection.retainAll()
始终引发NullPointerException
;之前,当集合为空时不会引发NullPointerException
。此项变更使行为符合文档要求。在 Android 8.0 中,
Collections.sort()
是在List.sort()
的基础上实现的。在 Android 7.x(API 级别 24 和 25)中,则恰恰相反。在过去,List.sort()
的默认实现会调用Collections.sort()
。
此项变更使 Collections.sort()
可以利用优化的 List.sort()
实现,但具有以下限制:
-
List.sort()
的实现不能调用Collections.sort()
,因为这会导致堆栈因无限递归而溢出。相反,如果您需要List
实现的默认行为,应避免重写sort()
。如果父类以不适当的方法实现
sort()
,通常最好使用在List.toArray()
、Arrays.sort()
和ListIterator.set()
的基础上构建的实现重写List.sort()
。例如:@Override public void sort(Comparator<? super E> c) { Object[] elements = toArray(); Arrays.sort(elements, c); ListIterator<E> iterator = (ListIterator<Object>) listIterator(); for (Object element : elements) { iterator.next(); iterator.set((E) element); } }
public void sort(Comparator<? super E> c) { Object[] elements = toArray(); Arrays.sort(elements, c); ListIterator<E> iterator = (ListIterator<Object>) listIterator(); for (Object element : elements) { iterator.next(); iterator.set((E) element); } }在大多数情况下,您也可以使用根据 API 级别委托给其他默认实现的实现重写
List.sort()
。例如:@Override public void sort(Comparator<? super E> comparator) { if (Build.VERSION.SDK_INT <= 25) { Collections.sort(this); } else { super.sort(comparator); } }
public void sort(Comparator<? super E> comparator) { if (Build.VERSION.SDK_INT <= 25) { Collections.sort(this); } else { super.sort(comparator); } }如果您选择后者只是因为您希望开发一种适用于所有 API 级别的
sort()
函数,可以考虑赋予其一个唯一的名称,例如sortCompat()
,而不是重写sort()
。 -
现在,
Collections.sort()
只是对调用sort()
的 List 实现进行的一项结构性修改。例如,在 Android 8.0 之前的平台版本中,如果通过调用List.sort()
进行排序,则当迭代处理ArrayList
以及在迭代过程中调用sort()
时,会引发ConcurrentModificationException
。而Collections.sort()
则不会引发异常。此项变更使平台行为更加一致:现在,两种方法都会引发
ConcurrentModificationException
。
影响面向android O 8.0应用的:
1.后台限制
(1)startService() 将抛出 IllegalStateException
(2)限制在AndroidManifest.xml中注册接收隐式广播,如ACTION_PACKAGE_REPLACED ,但也有些例外如ACTION_BOOT_COMPLETED,ACTION_LOCALE_CHANGED(所有例外参考文末连接)。(注意此部分限制都是只针对targetSdkVersion为android O,或者编译的SDK为android O及以上的的,低于的则不受影响)
2.隐私相关变化
(1)获取系统属性net.dns1、net.dns2、net.dns3 和 net.dns4不再可用
(2)不再支持 Build.SERIAL,而改为 Build.getSerial()
3.本地库变化
在Android O上强制要求Segment不能同时具备写和可执行,如数据段不可执行,代码段不可写。
4.ContentProvider的变更通知
调用 ContentResolver.notifyChange()和registerContentObserver(Uri, boolean, ContentObserver) 实现通知和监听某些Uri上的变化,在Android O上则要求uri对应的ContentProvider要正确定义,但是没有定义会有怎样的问题并没有提及
5.应用快捷方式变化
以com.android.launcher.action.INSTALL_SHORTCUT广播方式创建快捷方式不再有效,而要使用 ShortcutManager的 requestPinShortcut()方法。
3.网络连接及HTTPS相关:在connect失败之后,调用send(DatagramPacket)会抛出SocketException,以及其他一些细节的变化
6.其他
Alter Window的显示,集合排序方法的变化和获取用户帐号权限变化等。
三.Android 8.0新特性
Android O 新特性一 通知渠道 — Notification
创建通知渠道的步骤:
- 创建 NotificationChannel 对象,并设置应用内唯一的通知 ID。
- 配置通知渠道的属性,比如提示声音等。
- 在 NotificationManager 中注册通知渠道对象。
Android O 新特性二自适应图标 —Adaptive Icons
Android 的屏幕适配一直以来都折磨着不少的开发者。为了帮助开发者更好的与设备 UI 集成,Android O 支持创建自适应图标,
系统可以基于设备选择的蒙版将这些图标显示为不同形状。系统还将实现与图标的自动交互,并在启动器、快捷方式、设置、共享对话框以及概览屏幕中使用它们。
在以前的 Android 版本中,图标大小定义为 48 x 48 dp。现在你必须按照以下的规范定义你的图层大小:
- 两张图层大小都必须为 108 x 108 dp。
- 图层中心 72 x 72 dp 范围为可视范围。
- 系统会保留四周外的 36dp 范围用于生成有趣的视觉效果(如视差和跳动)。
Android O 新特性三画中画模式 — PIP
Android O 现已支持 Activity 的画中画模式。PIP 是一种多窗口显示模式,多用于视频播放,即你可以一边发微信一边看视频。
画中画模式图示
开发指南
1> 关于生命周期
PIP 模式不会改变 Activity 的生命周期。在指定时间只有最近与用户交互过的 Activity 为活动状态。 该 Activity 将被视为顶级 Activity。 所有其他 Activity 虽然可见,但均处于暂停状态。当一个 Activity 处于 PIP 模式时,其实它是出在暂停状态,但其内容会继续展示。
2> API变更
在 Android O 中新增 PictureInPictureArgs 对象来指明你的 Activity 在 PIP 模式中的属性,比如长宽比等。
Android O 还新增了以下方法来支持 PIP。
- Activity.enterPictureInPictureMode(PictureInPictureArgs args):将Activity置于 PIP 模式之下。
- Activity.setPictureInPictureArgs():用于更新 Activity 在 PIP 模式下的设置。如果 Activity 正处于 PIP 模式之下,那么更改的属性将立即生效。
参考链接
http://blog.csdn.net/w7849516230/article/details/68935953