Android 9.0适配指北

2024-06-15 09:48
文章标签 android 适配 9.0 指北

本文主要是介绍Android 9.0适配指北,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、刘海屏适配

1、layoutInDisplayCutoutMode属性

Android 9.0系统中提供了3种layoutInDisplayCutoutMode属性来允许应用自主决定该如何对刘海屏设备进行适配。

  • LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
    这是一种默认的属性,在不进行明确指定的情况下,系统会自动使用这种属性。这种属性允许应用程序的内容在竖屏模式下自动延伸到刘海区域,而在横屏模式下则不会延伸到刘海区域
  • LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
    这种属性表示,不管手机处于横屏还是竖屏模式,都会允许应用程序的内容延伸到刘海区域
  • LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER 这种属性表示,永远不允许应用程序的内容延伸到刘海区域

2、配置layoutInDisplayCutoutMode的方式

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {window.attributes.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
}

layoutInDisplayCutoutMode使用默认值,即我们不去设置。即使我们不做任何的适配工作,绝大多数的程序在默认情况下也是可以自动适配刘海屏手机的,并不会产生应用程序无法使用等问题的发生。
但是,假如你开发的是一款视频类应用或者游戏的话(横屏显示),充分利用屏幕的空间明显可以带来更好的用户体验,界面上留着一条大黑边对用户总归是不够友好的。这个时候我们就可以通过指定layoutInDisplayCutoutMode属性的值,来让应用程序具备更好的屏幕适配性。
在这里插入图片描述红色箭头处有条大黑边。如果我们将layoutInDisplayCutoutMode设置为LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES,大黑边就会消失。并且设置沉浸式布局

override fun onWindowFocusChanged(hasFocus: Boolean) {super.onWindowFocusChanged(hasFocus)if (hasFocus && Build.VERSION.SDK_INT >= 19) {val decorView = window.decorViewdecorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLEor View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATIONor View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREENor View.SYSTEM_UI_FLAG_HIDE_NAVIGATIONor View.SYSTEM_UI_FLAG_FULLSCREENor View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)}
}

效果如下图:
在这里插入图片描述
这样在玩游戏时是不是爽多了。但是这种情况会有一个问题,下面来看看。

3、需要适配的地方

但是界面上交互的一些按键可能被刘海挡住,这样用户就不能点击了。效果如下:
在这里插入图片描述
我们左边的按键被刘海挡住一部分。这种情况就需要我们进行适配了。

DisplayCutout类主要用于获取凹口位置和安全区域的位置等。主要方法如下所示:
getBoundingRects():返回Rects的列表,每个Rects都是显示屏上非功能区域的边界矩形。
getSafeInsetLeft ():返回安全区域距离屏幕左边的距离,单位是px。
getSafeInsetRight ():返回安全区域距离屏幕右边的距离,单位是px。
getSafeInsetTop ():返回安全区域距离屏幕顶部的距离,单位是px。
getSafeInsetBottom():返回安全区域距离屏幕底部的距离,单位是px。
安全区域示意图如下:
在这里插入图片描述
适配代码如下:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {root_layout.setOnApplyWindowInsetsListener { view, windowInsets ->val displayCutout = windowInsets.displayCutoutif (displayCutout != null) {val left = displayCutout.safeInsetLeftval top = displayCutout.safeInsetTopval right = displayCutout.safeInsetRightval bottom = displayCutout.safeInsetBottomval leftParams: FrameLayout.LayoutParams = btn_left.layoutParams as FrameLayout.LayoutParamsleftParams.setMargins(left, top, right, bottom)}windowInsets.consumeSystemWindowInsets()}
}

root_layout是界面的根布局,上面代码就是获取安全区域,将按钮设置在安全区域以外。效果如下:
在这里插入图片描述
现在按钮就没有被刘海挡住了。

二、non-SDK接口限制

一般来说,SDK 接口是指在 Android 框架软件包索引中记录的接口。 对非 SDK 接口的处理是 API 抽象化的实现细节;其会随时更改。
Android P 引入了针对非 SDK 接口的新使用限制,无论是直接使用还是通过反射或 JNI 间接使用。 无论应用是引用非 SDK 接口还是尝试使用反射或 JNI 获取其句柄,均适用这些限制。
名单分类:

  • Light grey list: targetSDK>=P时,警告;
  • Dark grey list:targetSDK<P时,警告;>=p时,不允许调用;
  • Black list:三方应用不允许调用;

三、Battery Improvements

谷歌在P版本之前没有一个完整的功耗解决方案,OEM厂商分别开发各自的功耗方案,管控手段都包括了清理应用,功耗得到优化,但是同时也影响了三方应用的一些功能正常使用,谷歌为了解决这个问题在P版本提出了自己的功耗解决方案。
主要方案:
AAB(Auto Awesome Battery):
1、通过ML算法将应用进行分类,不同类型的应用功耗管控策略不一样
2、Firebase Cloud Messaging (FCM):管控三方消息接收的频率
3、谷歌提供了统一的应用的管控方法:Forced App Standby (FAS),谷歌不会通过清理应用来优化功耗
Extreme Battery Saver(EBS)谷歌超级省电模式;
Smart screen brightness:屏幕亮度调节优化算法。
影响
谷歌功耗方案对三方应用各种管控,存在导致应用后台功能无法正常使用的可能,特别是:IM、邮箱、闹钟、音乐(直播)、地图导航、运动健康、下载、日历等应用影响比较大。目前通过谷歌提供的调试命令验证:所有的应用都有可能会被分到管控的类型,对三方的后台功能是有影响的。

这篇关于Android 9.0适配指北的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1063112

相关文章

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

android应用中res目录说明

Android应用的res目录是一个特殊的项目,该项目里存放了Android应用所用的全部资源,包括图片、字符串、颜色、尺寸、样式等,类似于web开发中的public目录,js、css、image、style。。。。 Android按照约定,将不同的资源放在不同的文件夹中,这样可以方便的让AAPT(即Android Asset Packaging Tool , 在SDK的build-tools目

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使

Android Environment 获取的路径问题

1. 以获取 /System 路径为例 /*** Return root of the "system" partition holding the core Android OS.* Always present and mounted read-only.*/public static @NonNull File getRootDirectory() {return DIR_ANDR

Android逆向(反调,脱壳,过ssl证书脚本)

文章目录 总结 基础Android基础工具 定位关键代码页面activity定位数据包参数定位堆栈追踪 编写反调脱壳好用的脚本过ssl证书校验抓包反调的脚本打印堆栈bilibili反调的脚本 总结 暑假做了两个月的Android逆向,记录一下自己学到的东西。对于app渗透有了一些思路。 这两个月主要做的是代码分析,对于分析完后的持久化等没有学习。主要是如何反编译源码,如何找到

android系统源码12 修改默认桌面壁纸--SRO方式

1、aosp12修改默认桌面壁纸 代码路径 :frameworks\base\core\res\res\drawable-nodpi 替换成自己的图片即可,不过需要覆盖所有目录下的图片。 由于是静态修改,则需要make一下,重新编译。 2、方法二Overlay方式 由于上述方法有很大缺点,修改多了之后容易遗忘自己修改哪些文件,为此我们采用另外一种方法,使用Overlay方式。