Android开发中的各种零碎知识点

news2025/1/10 20:41:26

折叠屏

  • 折叠屏为什么需要适配
    折叠屏在视觉效果来说就是,屏幕变大了,手机变平板。这样就需要我们的app在可折叠设备展开时,当前应用页面必须无缝延续到另一个屏幕,并可自动调整大小匹配新的布局,也就是说,应用程序需要准备好在多个屏幕(不同分辨率、密度等)之间切换。

    折叠屏之所以需要适配,是因为我们的应用有可能在运行的过程中,所在的屏幕尺寸发生了变化,这种情况对现有项目多少都会产生一些问题。

    其实这种情况并不是折叠屏出现之后才有的,应用的纵向横向切换也会发生同样的情况,只不过很多应用都强制纵向,不需要处理这种适配了。

折叠屏适配的本质

折叠屏适配的本质是:当应用运行时,屏幕的尺寸、密度或比例发生了变化,应用能够继续在变化后的屏幕上正常显示和正常运行。

对于开发同学来说,对折叠屏的适配首先要确定一个预期,即要先确定好交互和设计,才能评估工作。因此”折叠屏“的适配先是一个设计问题,然后才是一个适配问题。

适配指导

  • 相对单位:为了适应不同屏幕尺寸和不同使用场景,使用绝对单位容易出现问题。
  • 临界点:比如屏幕宽度小于这个宽度时显示一个样式,大于这个宽度时显示另一个样式。
  • 应用支持自适应能力:建议应用支持可变比例显示,在可预见的屏幕比例范围内,都可以做到良好适配。
 <application
        android:resizeableActivity="true"//Android7及以上默认开启
  • 设置应用支持的最大比例和最小比例适配
    当resizeableActivity为false时,展开折叠屏可能会变成这样的效果,这个效果类似在iPad上使用不兼容的iPhone应用,这个四周用黑色填充的模式,叫兼容模式。
    兼容模式的显示和最大支持比例maxAspectRatio有关,当屏幕比例超过maxAspectRatio时才会用黑边填充,官方建议把maxAspectRatio设为2.4(12:5)
    在这里插入图片描述
    在这里插入图片描述
  • 切换显示比例应用不重启适配
    折叠/展开的操作过程将触发系统向应用发送新布局的配置更改,包括smallestScreenSize、screenSize和screenLayout的配置

折叠屏展开——折叠之后Activity的生命周期,可以发现Activity会销毁后重建

onPause()->onStop()->onDestory()->onCreate()->onStart()->onResume()

如果想禁止Activity销毁重建,则需要在AndroidManifest中对Activity的configChanges进行如下的配置:

      <activity
            android:configChanges="screenSize|smallestScreenSize|screenLayout"
            android:name=".MainActivity"
            android:exported="true">

这个时候折叠屏展开——折叠会走Activity#onConfigurationChanged,就不会走activity的生命周期,更新视图布局、重新加载资源。通过此方法既能实现在系统不重启Activity的情况下重置UI。总的来说,折叠屏的适配有点类似平板+旋转屏的综合体,也需要配置文件+多布局。

    @Override
    public void onConfigurationChanged(@NonNull Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if(FoldableDeviceUtil.INSTANCE.isFold()){//是否有折叠屏
            //瀑布流
        }

    }

package com.example.hilibrary.util

import android.app.Application
import android.os.Build
import android.text.TextUtils
import org.w3c.dom.Text

object FoldableDeviceUtil {

    val application: Application? =null

    fun isFold():Boolean{
        return if(TextUtils.equals(Build.BOARD,"samsung")&&
            TextUtils.equals(Build.DEVICE,"Galaxy Z Fold2")){
            return HiDisplayUtil.getDisplayWidthInPx(application!!)!=1768
        }else if(TextUtils.equals(Build.BOARD,"huawei")&&
            TextUtils.equals(Build.DEVICE,"MateX")){
            return HiDisplayUtil.getDisplayWidthInPx(application!!)!=2200
        }else if(TextUtils.equals(Build.BOARD,"google")&&
            TextUtils.equals(Build.DEVICE,"generic_x86")){//模拟器
            return HiDisplayUtil.getDisplayWidthInPx(application!!)!=2200
        }else{
            true
        }
    }
}

可折叠设备没有android api或回调可以让我们知道当前处于折叠模式还是展开模式。
对于不同尺寸屏幕适配过程中,为了确保在折叠屏各个屏幕形态下获取最佳的布局显示效果,应用界面正确、美观的布局和显示,包含如下:

  • 布局能够根据屏幕适当地调整大小
  • 根据屏幕配置提供合适的UI布局
  • 提供可正常缩放的位图

ConstraintLayout

  • 基于自适应尺寸的wrap_content、match_parent、weight避免固定的尺寸单位。
  • 使用基于控件相对位置的布局,现在更加推荐使用ConstraintLayout,对于布局性能以及扁平化更具有优势。
  • 考虑使用自动拉伸的.9图或者使用矢量图。

Android Q暗黑模式适配

暗黑模式的适配大概可以分为三部分:

  1. 背景
  2. 文字
  3. 图标

适配的方式也分为三种:自动适配、自定义适配、换肤框架适配

自动适配暗黑模式

Android 10提供Force Dark功能,此功能可以让开发者快速实现深色主题背景。

<style name="Base.Theme.MyApplication" parent="Theme.Material3.DayNight.NoActionBar">
        <!-- Customize your light theme here. -->
        <!-- <item name="colorPrimary">@color/my_light_primary</item> -->
        <item name="android:forceDarkAllowed" tools:ignore="NewApi" />//添加这句代码即可
    </style>

自定义适配

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

主动切换主题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

换肤方式适配

这种方式主要是获取和监听系统深色主题模式的开启状态动态设置主题或皮肤。

  1. 首先我们需要定义好深色主题或者皮肤,换肤功能通过Android-skin-support来实现。
  2. onCreate方法中在setContentView之前判断是否开启暗黑模式,设置暗主题。

Android权限治理

  • 仅申请业务功能所需权限
  • 告知申请权限的目的
  • 调用权限的频率应合理
  • 增强用户的权限控制机制

仅申请业务功能所需权限

App运营者应充分调研并明确业务功能所需的权限,不应申请App不会用到的权限或者一次性申请所有权限,还需要注意区分必要权限和业务所需权限。

  • 必要权限
    是指保障App正常运行所必需的最少权限,一般都是在App首次开启时,需用户同意授权必要权限后,才能正常进入App主页面(常见的有“存储权限”等)
  • 业务所需权限
    是指为了保障app在运行时某项功能正常运行,不得不向用户申请权限(比如录音,电话,相机)。App运营者需保证业务所需权限的合理性。
    不能在实现某种业务功能时,将开启权限作为唯一的实现方式,强迫用户打开权限(比如在实现添加联系人信息火手机充值功能时,仅提供打开通讯录权限并选取联系人这一种方式,不同时提供用户自主输入联系人的方式)

告知申请权限的目的

App向用户申请权限时未告知目的导致的误会已成为一大痛点,比如,某音乐类App向用户申请存储权限(部分手机在申请该权限会显示是否允许读取照片/视频),用户会疑惑音乐类app为什么要读取照片,而且不同意还不能使用,这不是典型的强制索要无关权限吗?

事实上,此类App申请存储权限是为了音乐下载和离线缓存,和读取照片视频无关,申请权限时做出解释立马真相大白,可见告知申请权限的目的的重要性。

申请权限的弹窗机制在不同手机操作系统上表现不同,比如,在iOS系统中,申请权限的弹窗事实上是可以编辑文字的,如此可很方便地将申请权限的目的在弹窗予以注明。但是Android系统就无法更改,这个是手机厂商写死的。

申请权限前弹窗告知

申请权限弹窗出现前,由App自行以弹窗等形式将需要申请权限的目的予以明确告知

在这里插入图片描述

被拒后再弹窗说明

先由系统进行弹窗申请权限,如果用户不理解点击拒绝后,再次弹出提示框向用户告知申请权限的目的
在这里插入图片描述

并不是所有的申请权限均需要采取弹窗告知方式

在使用App的过程中,用户选择了“拍照”或“共享位置”功能,App弹窗告知需要获取“拍摄照片和录制视频”等权限,虽未单独再通过弹窗等方式告知申请目的,但完全不影响用户对申请该权限目的的理解。

综上,使用额外弹窗等方式告知申请权限的目的,更多地是针对首次运行App时申请权限的情形,对于用户而言,在首次打开App且未进入主界面前,用户无法看到App的功能界面,无法理解具体的功能需求,因此,在此阶段以增强提示的方式告知申请权限的目的是合规的重点。

选择恰当的时机和方式

从App申请权限的时机来看,通常分为以下三类情形

  • 第一类是在安装App时申请
    以安装App时申请权限为例,有App会基于安卓系统的权限申请机制,采取将其targetSDKversion值设置小于23的方式,要求用户一次性同意开启多个可收集个人信息权限,不同意则无法安装使用APP。这种是应当被叫停的一种权限申请机制。
  • 第二类是在首次打开app时申请
    以首次打开App时申请权限为例,绝大部分App会在该阶段申请其主要业务功能所需的权限,尤其是支持App基本业务功能运行的必要权限。根据不同手机所采取的机制不同,有的是通过多次弹窗形式实现,有的是一次性让用户选择需开启的权限。
    该阶段受手机操作系统的制约较大,不便于向用户同步告知申请权限的目的,也不便于让用户判断哪些权限是必要的,充分行使其选择权。因此,建议App在该阶段仅申请支持其基本业务功能所需的最小必要的权限范围。
    比如,App无需任何权限可进入主界面进行浏览等基本操作,可选择在该阶段实现零申请的方式,减少用户对申话权限的疑惑和误解,省去以弹窗等方式同步告知申话权限目的,给予用户零打扰的良好体验。
  • 第三类是使用App时根据需求逐项申请
    使用App时根据实际需求逐项申请,该方式无疑是最为合理和推荐的权限申请方式。一方面用户可以根据具体业务功能和服务类型等准确理解申请权限的目的,App无需再对目的进行资述,另一方面用户可以充分行使其选择权,让授权过程不再成为一笔糊涂账。比如在需要扫码或照相时,App才会申请相机权限,在同步通讯录好友时,才会申请通讯录权限。而当用户拒绝时,仅影响当前功能的实现。

此外,频繁申请权限(如每次重新打开App便重新索要权限、使用App过程中会反复触发申请权限机制等)造成用户打扰已经成为网友们广泛“诟病”的问题。
新发布的国家标准草案“移动互联网应用 (App)收集个人信息基本规范”给出明确指导性建议,用户明确拒绝使用某服务类型后,App不得频繁 (每48小时不超过一次)征求用户同意使用该类型服务,并保证其他服务类型正常使用。
总之,申请权限的时机和方式,与用户体验紧密相关,建议App运营者全面考虑各种要素,优化App中请权限过程,不要让申请权限过程变得别扭、将就,最终影响的是用户对App的印象和用户的转化率。

调用权限的频率应合理

权限是手机个人信息的一扇窗户,一旦窗户打开,手机个人信息的行为随时可能发生。而对于用户来讲,调用权限相关函数获取个人信息的过程无法感知,心里没底。这就可能会导致出现以下超出合理频率范畴过度采集个人信息的行为。

  1. 在用户未使用某业务功能时,就已经发生调用权限收集与该业务功能相关个人信息的行为。
    用户在首次开启App时开启了“通讯录”、“短信”等权限,用户并未使用涉及该权限的功能,仅是浏览主界面,便出现了调用权限相关函数上传个人信息的行为。

  2. 调用权限收集个人信息的频次明显超出实现业务功能所需。
    比如开启位置权限实现查询当地天气的功能,但实际App每秒都获取并上传用户的精准位置。

  3. 当App在静默或后台运行时,仍存在不断调用权限收集个人信息的行为。
    事实上,以上不规范的调用权限方式均可以使用技术手段进行监测,建议App运营者详尽分析自身业务功能所需调用权限的具体频率,必要时,还可以在隐私政策等向用户直接说明。

增强用户的权限控制机制

众所周知,手机操作系统自身已经为用户提供了开启、关闭权限的控制机制。但是,从用户体验来看,在安装大量App后,使用该机制查询权限开启情况或改变权限设置等操作变得不太方便。此外,很多平台型APP上存在大量第三方应用或服务也涉及到调用权限的问题,但手机操作系统并未提供额外的控制机制。建议App运营者进一步考虑用户对于权限的控制需要,优化和创新用户对权限的控制机制。比如,某App专门在其"隐私设置”中设置了方便查询权限开启情况的交互式页面,并提供简单易懂可迅速切换至权限控制页面的通道

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/972135.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

护航数字政府建设,美创科技成为“数字政府建设赋能计划”成员单位

近日&#xff0c;“2023软博会-软件驱动数字政府创新发展论坛”顺利召开&#xff0c;本次论坛由中国信息通信研究院、中国通信标准化协会承办&#xff0c;中国通信标准化协会云计算标准和开源推进委员会、数字政府建设赋能计划支持。 天津市工业和信息化局总经济师杨冬梅、中国…

OpenHarmony 使用 ArkUI Inspector 分析布局

● 摘要&#xff1a;视图的嵌套层次会影响应用的性能&#xff0c;开发者应该移除多余的嵌套层次&#xff0c;缩短组件刷新耗时。本文会介绍如何使用 ArkUI Inspector 工具分析布局&#xff0c;提示应用响应性能。 ● 关键字&#xff1a;列举本文相关的关键字&#xff1a;OpenH…

springboot找不到注册的bean

1、错误描述 A component required a bean named ‘fixedAssetsShareMapper’ that could not be found.Action:Consider defining a bean named ‘fixedAssetsShareMapper’ in your configuration.2、问题分析 1、该错误提示表明在你的应用程序中有一个组件&#xff08;可能…

【技术分享】RK Android11系统SD卡启动方法

本文基于Purple Pi OH 3566主板&#xff0c;介绍Android11源码的修改&#xff0c;获得可从SD卡启动的Android11系统镜像。 Purple Pi OH作为一款兼容树莓派的开源主板&#xff0c;采用瑞芯微RK3566 (Cortex-A55) 四核64位超强CPU,主频最高达1.8 GHz,算力高达1Tops&#xff0c;…

stable diffusion实践操作-大模型介绍-SDXL1大模型

系列文章目录 大家移步下面链接中&#xff0c;里面详细介绍了stable diffusion的原理&#xff0c;操作等&#xff08;本文只是下面系列文章的一个写作模板&#xff09;。 stable diffusion实践操作 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生…

Qt鼠标点击事件处理:显示鼠标点击位置(完整示例)

Qt 入门实战教程&#xff08;目录&#xff09; 前驱文章&#xff1a; Qt Creator 创建 Qt 默认窗口程序&#xff08;推荐&#xff09; 什么是事件 事件是对各种应用程序需要知道的由应用程序内部或者外部产生的事情或者动作的通称。 事件&#xff08;event&#xff09;驱动…

BFS练习1

BFS练习1 - 题目 - Daimayuan Online Judge 问题描述&#xff1a; 刚开始吓一跳&#xff0c;以为有什么更简单的呢&#xff0c;因为每一次都要走一次bfs&#xff0c;看了数据范围后&#xff0c;感觉跑一次bfs进行记录即可。 代码&#xff1a; void solve() {int a,k; cin>…

【Python】OpenCV安装

安装起来相当简单&#xff0c;但是看到很多博客的安装过程复杂得很。 pip install opencv-python测试代码&#xff1a; import cv2 as cv img cv.imread("f6759b83f3201997fd7ea1c9b9130a44.jpg")cv.imshow("Display window", img) k cv.waitKey(0) # …

Tiny Player Mac:小而美,音乐播放的极致体验

对于追求音质和操作简便的Mac用户来说&#xff0c;Tiny Player Mac是一款不可多得的音乐播放器。它以简洁的界面、强大的功能和优异的性能&#xff0c;吸引了无数用户的目光。接下来&#xff0c;让我们一起了解这款小而美的音乐播放器。 Tiny Player Mac支持多种音频格式&#…

使用 ModelScope 文本到视频合成模型

链接如下&#xff1a; ModelScope Text To Video Synthesis - a Hugging Face Space by damo-vilabDiscover amazing ML apps made by the communityhttps://huggingface.co/spaces/damo-vilab/modelscope-text-to-video-synthesis 标题&#xff1a;使用 ModelScope 文本到视…

OSI与TCP IP各层的结构与功能,都有哪些协议

分析&回答 OSI七层模型 层功能TCP/IP协议族应用层文件传输&#xff0c;电子邮件&#xff0c;文件服务&#xff0c;虚拟终端TFTP&#xff0c;HTTP&#xff0c;SNMP&#xff0c;FTP&#xff0c;SMTP&#xff0c;DNS&#xff0c;Telnet表示层数据格式化&#xff0c;代码转换…

【C++】C++面向对象编程三大特性之一——继承

❤️前言 本篇博客主要是关于C面向对象编程中的三大特性之一的继承&#xff0c;希望大家能和我一起共同学习进步&#xff01; 正文 我们刚刚学习一块全新的知识&#xff0c;首先简单关注一下它的概念和简单的使用方法。 继承的概念及定义 继承的概念 继承的概念&#xff1a;…

内网穿透实战应用-如何通过内网穿透实现远程发送个人本地搭建的hMailServer的邮件服务

文章目录 1. 安装hMailServer2. 设置hMailServer3. 客户端安装添加账号4. 测试发送邮件5. 安装cpolar6. 创建公网地址7. 测试远程发送邮件8. 固定连接公网地址9. 测试固定远程地址发送邮件 hMailServer 是一个邮件服务器,通过它我们可以搭建自己的邮件服务,通过cpolar内网映射工…

CentOS7 Hadoop3.3.0 安装与配置

一、安装JDK 1、创建文件夹tools和training用于存放压缩包和解压使用&#xff0c;tools存放压缩包&#xff0c;training用于解压后安装jdk和hadoop的路径。 1&#xff09;回到路径为 / 的位置 cd /2) 创建 tools 和 training mkdir toolsmkdir training3) 进入tools文件夹 …

47、TCP的流量控制

从这一节开始&#xff0c;我们学习通信双方应用进程建立TCP连接之后&#xff0c;数据传输过程中&#xff0c;TCP有哪些机制保证传输可靠性的。本节先学习第一种机制&#xff1a;流量控制。 窗口与流量控制 首先&#xff0c;我们要知道的是&#xff1a;什么是流量控制&#xff…

AI篇-chatgpt基本用法(文心一言也适用)

目录 &#xff08;1&#xff09;基本规则 &#xff08;2&#xff09;例子1-文章摘要 &#xff08;3&#xff09;例子2-代码生成 &#xff08;4&#xff09;文心一言链接 &#xff08;1&#xff09;基本规则 相比于搜索引擎&#xff0c;ChatGPT的优势在于其高效的想法关联和…

Passwork 和 KeePass 密码管理器对比和选择

互联网蓬勃发展的今天&#xff0c;基本上我们能够想到的功能都可以找到相似的软件辅助工作效率。包括我们日常用到比较多的各种网站、软件账户的管理&#xff0c;如果用密码管理器管理可以确保信息的安全以及提高密码的安全性。在前面的文章中&#xff0c;乐小虎有写过”横向评…

ES6中导入import导出export

ES6使用 export 和 import 来导出、导入模块 用法 /** 导出 export *///分别导出 export let name 孙悟空; export function sum(a, b) {return a b; } } //先定义再导出 let age 18 export {age}/** 默认导出 export default */const a 默认导出; export default a;/**…

CS420 课程笔记 P4 - 以16进制形态编辑游戏文件

文章目录 IntroductionFinding save filesStringsUnicodeExample!Value searchHealth searchConclusion Introduction 这节课我们将学习编辑十六进制&#xff0c;主要用于编辑保存文件&#xff0c;但十六进制编辑涉及的技能可以很好地转移到&#xff1a; Save file editingRe…

CG MAGIC分享3d Max中的Corona渲染器材质如何成转换VRay材质?

大家无论是使用Corona渲染器还是Vray渲染器时&#xff0c;进行材质问题时&#xff0c;都会遇到转化材质问题。 如何将CR转换成VR或者将VR转换CR材质呢&#xff1f; 对于这两者之间转换最好最好的方法只能是材质转换器。 CG MAGIC小编&#xff0c;梳理了两种方法&#xff0c;大…