本文对开发Android P应用适配以及新版本相关特性,下图是博主开发的教育项目对刘海屏相关适配.
如图:
AndroidP开始提供规范化的接口,应用可以使用标准接口,获取当前是否有刘海,控制应用在刘海屏上的布局显示区域。AndroidP的设备支持模拟刘海效果,持有P的设备的可以打开“开发者选项”,找到“模拟巨有凹口的显示屏”进行模拟调试。
怎么判断支持刘海屏?
谷歌API: DisplayCutout cutout = mContext.getDisplayCutout();
返回DisplayCutout对象,为刘海的描述信息,不支持则返回空
怎么获取刘海信息?
DisplayCutout.getSafeInsets() 返回安全区域Rect
DisplayCutout.getBounds() 返回刘海的区域的Region
如何控制应用的布局显示?
1,LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
2,LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
3,LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
属性说明:
1,没有设置的情况下默认此标记,只有状态栏区域可见的情况下,才意味着加了FLAG_FULLSCREEN or SYSTEM_UI_FLAG_FULLSCREEN标记的应用窗口都会被切边放在刘海以下
2,此flag下不进行应用窗口的限制,窗口可以显示到刘海区域
3,此flag下应用窗口一直被限制在刘海区域以下
应用也可以通过theme来达到同样的效果
- default
对应LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
- shortEdges
对应LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
- never
对应LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
应用遇到窗口显示被限制在刘海以下区域的可以调整layoutInDisplayCutoutMode 设置为LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES,再通过获取DisplayCutout 关于刘海区域信息,调整UI达到更好的满屏体验。
Crypto JCA 提供程序已被移除。调用 SecureRandom.getInstance(“SHA1PRNG”,“Crypto”) 将会引发 NoSuchProviderException,调用Bouncy Castle 提供程序的 getInstance(),会生成 NoSuchAlgorithmException 错误。
A:影响范围:
(1)Crypto JCA 提供程序已被移除,此影响所有运行AndriodP系统的所有应用;
(2)Bouncy Castle 提供程序异常的问题,影响所有targetsdkversion>=28的应用;
B: 如何适配
模块应该在getInstance()的时候不指派提供程序,采用默认实现即可
AndroidP上,从非 Activity 环境中启动 Activity,除非传递 Intent 标志 FLAG_ACTIVITY_NEW_TASK。 如果尝试在不传递此标志的情况下启动 Activity,则该 Activity 不会启动,此限制对所有运行AndroidP的应用生效。
Android 9 限制后台应用访问用户输入和传感器数据的能力。 如果您的应用在运行 Android 9 设备的后台运行,系统将对您的应用采取以下限制:
(1)应用不能访问麦克风或摄像头。
(2)使用连续报告模式的传感器(例如加速度计和陀螺仪)不会接收事件。
(3)使用变化或一次性报告模式的传感器不会接收事件。
targetsdkversion>=28的应用在使用前台服务的都需要进行必须请求 FOREGROUND_SERVICE 权限。 这是普通权限,因此,系统会自动为请求权限的应用授予此权限。
AndroidP上,对应targetsdkversion>=28的应用需要为特定域名启用明文,必须在应用的网络安全性配置中针对这些域名将 cleartextTrafficPermitted 显式设置为 true,默认情况下明文传输会直接抛出“java.io.IOException: Cleartext HTTP traffic to xxx.com not permitted”异常。
targetsdkversion>=28的应用不允许在不同进程之间共享一个 WebView 数据目录。如果应用有多个进程使用 WebView、CookieManager 或 android.webkit 软件包中的任何其他 API,则在第二个进程调用 WebView 函数时,应用将会崩溃。
AndroidP后,不再允许应用直接读取 /proc/net/xt_qtaguid 文件夹中的文件。 这样做是为了确保与某些根本不提供这些文件的设备保持一致。应用应该采用标准 API TrafficStats 和 NetworkStatsManager 进行访问,此限制对所有运行AndroidP系统上的应用生效。
对于targetsdkversion>=28的应用,系统强制每个应用的 SELinux 沙盒对每个应用的私有数据目录强制执行逐个应用的 SELinux 限制。现在,不允许直接通过路径访问其他应用的数据目录。应用可以继续使用进程间通信 (IPC) 机制(包括通过传递 FD)共享数据,例如可以采用FileProvider。
为自己技术增值,量变引起质变.对象亦来源于生活,模式亦来源于验证的OO经验,那么请学会使用轮子,再到感受制造轮子的乐趣,你会发现原来编程那么美妙.如有错误或不当之处,请读者留言,博主好吸取经验,互相交流学习
(1)AndroidP所有应用行为变更:https://developer.android.com/about/versions/pie/android-9.0-changes-all
(2)AndroidP targetSDK 28应用行为变更:https://developer.android.com/about/versions/pie/android-9.0-changes-28
(3)AndroidP 电源管理:https://developer.android.com/about/versions/pie/power
(4)pixles系列镜像升级:https://developers.google.com/android/images