AndroidTraining学习------Support-Different-Devices

RK3572-Android16-记录一次OTA升级失败解决方案 这里记录一次解决RK3576 Android16 OTA 用Recovery 升级失败的一次解决案例,将部分经验作为总结。本次OTA升级耗时了几天,最终是RK给出的解决方案,再加上经验来解决了其它部分问题新平台,高一点的Android版本,可能本身有bug,多请教平台来,不要蒙着干,干不出来的。 阅读详情

Support Different Devices

全世界的Android设备有着各种各样的外形和尺寸。通过各种各样的设备类型,我们有机会使我们的app接触到广大的用户群体。为了能在各种各样的Android设备上使用,我们的app需要适配不同的设备类型。某些重要的因素你应该加以考虑,比如不同的语言,屏幕尺寸以及各种Android系统版本。

Supporting Different Language

把UI中的字符串存储在外部文件,然后通过代码提取,这是一个很好的做法。Android可以通过工程中的一个资源目录轻松的实现这一功能。
如果你使用Android SDK Tools创建工程,tools会在工程的根目录创建一个res/目录,res/目录中是所有资源类型的子目录。也有一些默认的文件,比如res/values/string.xml,用于保存字符串值。

Create Locale Directories and String Files

为了支持更多的语言,在res/中创建额外的values目录,目录名字以连字符和ISO语言代码结尾。比如values-es/是语言代码为“es“的区域设置的简单资源文件的目录。Android会根据设备运行时的区域设置,加载合适的资源。
一旦决定支持语言,就需要创建资源子目录和字符串资源文件。比如:

MyProject/
    res/
        values/
            strings.xml
        values-es/
            strings.xml
        values-fr/
            strings.xml

将区域语言字符串值添加到相应的文件中。
在运行时Android系统会基于用户设备当前的区域设置使用相应的字符串资源。
比如,下面是一些不同语言的字符串资源。
English(default),/values/strings.xml:

<resources>
    <string name="app_name">My Application</string>
    <string name="hello_world">Hello World!</string>
</resources>

Spanish,/values-es/strings.xml:

<resources>
    <string name="app_name">Mi Aplicación</string>
    <string name="hello_world">Hola Mundo!</string>
</resources>

French,/values-fr/strings.xml:

<resources>
    <string name="app_name">Mon Application</string>
    <string name="hello_world">Bonjour le monde !</string>
</resources>

Use the String Resource

你可以通过源代码来引用字符串资源,其他XML文件可以通过元素的name属性来引用字符串资源。
在源代码中可以通过R.string.语法来引用一个字符串资源。很多方法都可以通过这种方式来接受字符串资源。
比如:

//Get a string resource from your app's Resources
String hell = getResources().getString(R.string.hello_world);

// Or supply a string resource to a method that requires a string
TextView textView = new TextView(this);
textView.setText(R.string.hello_world);

在其他XML文件中,每当XML属性需要接受一个字符串值时,我们可以通过@string/语法来引用一个字符串资源。
比如:

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/hello_world"/>

Support Different Screens

Android用尺寸和分辨率两个常规的属性来对设备屏幕进行分类。我们应该预料到我们的app各种屏幕尺寸和分辨率的设备中。这样,我们应该准备一写可选资源,针对不同的屏幕尺寸和分辨率,来优化其外观。
* 四种普遍的尺寸:small,normal,large,xlarge;
* 四种普遍的分辨率:low(ldpi),medium(mdpi),high(hdpi),extra high(xhdpi)
为不同的屏幕定义不同的layouts和bitmaps,我们必须将这些可选的资源放在单独的目录中,就像适配不同的语言那样做。
同时也要注意到屏幕的方向也是一种需要考虑的屏幕尺寸变化,所以许多app需要修改Layout去优化用户在每个方向上的体验。

Create Different Layouts

为了优化在不同屏幕尺寸上的用户体验,我们需要为你想支持的每一个屏幕尺寸创建唯一的layout XML文件。每个布局应该保存在相应的资源目录中。名字以-为后缀。比如,一个大屏幕唯一的布局文件应该保存在res/layout-large/目录下。
为了匹配合适的屏幕Android会自动的测量我们的layout。因此不需要因为不同屏幕尺寸而担心UI元素的大小而应专注于布局结构对用户体验的影响(比如关键视图相对于同级视图的尺寸和位置)。
比如,这个工程包括一个默认布局和一个适配大屏幕的布局:

MyProject/
    res/
        layout/
            main.xml
        layout-large/
            main.xml

文件名必须完全一样,但是为了向相应的屏幕尺寸提供优化的UI,他们的内容可以不一样。
如平常一样在APP中简单引用layout文件:

@Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
  }

系统会基于app运行时的屏幕尺寸加载相应的layout文件。
另一个例子,这是一个适配横向屏幕的layout:

MyProject/
    res/
        layout/
            main.xml
        layout-land/
            main.xml

默认情况下,layout/main.xml文件用于纵向屏幕。
如果你想为横向屏幕提供一个专门的布局,同时也适配大屏幕,这时你需要同时使用large和land修饰符:

MyProject/
    res/
        layout/
            main.xml
        layout-large/
            main.xml
        layout-large-land/
            main.xml

**Android 3.2及更高版本支持定义屏幕的高级方法,它允许根据屏幕的最小宽度和高度,为各种屏幕指定与密度无关的资源。

Create Different Bitmap

我们应该为四种普遍的分辨率:low,medium,high和extra-high提供相应的bitmap资源。这能使我们的app在所有的屏幕分辨率下都有良好的画质和效果。
要生成这些图像,我们应该从原始的矢量资源开始,根据下列屏幕尺寸,生成各种分辨率的图像:
* xhdpi:2.0
* hdpi:1.5
* mdpi:1.0(基准)
* ldpi:0.75
这意味着如果你要为xhdpi设备生成一张200x200的图片,那么你应该为hdpi生成150x150,为mdpi生成100x100,为ldpi生成75x75的图片资源。
然后将相应的资源文件放在drawable资源目录中:

MyProject/
    res/
        drawable-xhdpi/
            awesomeimage-png
        drawable-hdpi/
            awesomeimage-png
        drawable-mdpi/
            awesomeimage-png
        drawable-ldpi/
            awesomeimage-png

任何时候,你引用@drawable/awesomeimage,系统都会根据屏幕密度选择相应的bitmap资源。
**低密度(ldpi)是非必要的,当你提供了hdpi图像资源时,系统会把hdpi图像的比例缩小一半,去适配ldpi。

Support Different Platform Version

最新的Android系统版本会为我们的app提供更棒的APIs,但我们仍应该支持Android系统的旧版本,直到更多的设备更新到新系统。
Platform Version的面板会定时地更新,通过统计访问Google Play Store的设备数量来显示运行每个系统的Android版本分布。通常,在app更新至最新版本时,先确保新版本的app可以支持90%的设备。
Tip:为了在几个Android版本上提供最好的特性和功能,我们应该在app中使用Support库,它允许我们在旧版本上使用最近几个平台的APIs。

Specify Munimum and Target API Level

AndroidManifest.xml文件描述了我们的app的细节,以及app所支持的Android系统版本。具体来说,元素中的minSdkVersion和targetSdkVersion属性,标明你在设计和测试app时,最低兼容API级别以及最高适用的API级别。
比如:

  <manifest xmlns:android="http://schemas.android.com/apk/res/android"...>
      <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="15" />
      ...
  </manifest>

随着新的Android版本的发布,一些样式或者行为可能会改变。为了使我们的app能够利用这些变化并确保app能够匹配不同风格的用户设备,我们应该将targetSdkVersion属性的值与可获得的最新Android版本匹配。

Check System Version at Runtime

Android在Build常量类中为每个平台版本提供了一个唯一的代号。在我们的App使用这些代号可以建立条件,确保依赖更高API级别的代号,只会在这些API在当前系统可用时才会执行。

  private void setUpActionBar() {
      // Make sure we're running on Honeycomb or higher to use ActionBar APIs
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
          ActionBar actionBar = getActionBar();
          actionBar.setDisplayHomeAsUpEnabled(true);
      }
  }

Note:当解析XML资源时,Android会忽略当前设备不支持的XML属性。所以我们可以安全的使用较新的Android版本,而不用当心旧版本遇到这些代号会崩溃。比如:如果我们设置targetSdkVersion=“11”,我们的app包括了Android 3.0及更高版本中的ActionBar。然后向Action Bar中添加菜单项,我们需要在菜单资源文件中设置android:showAsAction=”ifRoom”。在跨版本的XML文件中这么做是安全的,因为旧版本的Android系统会简单地忽略showAsAction属性(就是这样,你不需要用到res/menu-v11/中的单独版本文件)。

Use Platform Styles and Themes

Android提供了用户体验主题,为app提供可基础操作系统的外观和体验。通过manifest文件,这些主题可以被运行到我们的app中。通过使用内置的主题和样式,我们的app将随着系统的更新而自动匹配最新的外观和体验。
使你的activity看起来向对话框:

  <activity android:theme="@android:style/Theme.Dialog">

使你的activity有一个透明的主题:

  <activity android:theme="@android:style/Theme.Transucent">

应用在res/value/styles.xml定义的自定义主题:

  <activity android:theme="@style/CustomTheme">

添加一个主题到整个app(所有的activity),在元素中添加android:theme主题:

  <application android:theme="@style/CustomTheme">
Pytorch(一) Pytorch 的安装 安装步骤 1.检查是否有合适的GPU, 若有安装Cuda与CuDNN 2.下载pytorch安装文件,进行pytorch的安装 检查电脑是否有合适的GPU 在桌面上右击如果能找到NVIDA控制面板,则说明该电脑有GPU。控制面板如下,并通过查看系统信息获取支持的Cuda版本 点击 帮助->点击 系统信息 弹出下面的对话框,在驱动程序版本那一栏就能看到该计算机使用的驱动版本。 ... 阅读详情

相关推荐

[记录一个bug]av_hwdevice_ctx_create出现Cannot allocate memory(附带库运行时路径)[已解决]

新写的程序里调用ffmpeg的av_hwdevice_ctx_create()这个函数,出现Cannot allocate memory。但是另个程序一样的代码,居然是成功的。 反复检查之后无果,就跳出去查了一下,看到一个问答: Have you tried to use ffmpg executables with the same libs that you using when you run the app? Have you tried to use ffmpg executables

熊猫Ben的博客 3585

android开发:使用strings.xml中的字符串

strings.xml位于项目目录 res/values 下面。内容如下: TaskList 设置 新任务 我们可以在里面添加新的string. 在layout的xml中引用,用@string/,如下: <Button android:id="@+id/new_btn" android:layout_width="match_

1736

洛谷 P5736 【深基7.例2】质数筛

题目描述 输入 n(n\le100)n(n≤100) 个不大于 100000 的整数。要求全部储存在数组中,去除掉不是质数的数字,依次输出剩余的质数。 输入格式 无 输出格式 无 输入输出样例 输入 #1 复制 5 3 4 5 6 7 输出 #1 复制 3 5 7 板子题,使用一下线性筛 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using n

qq_37978559的博客 1117

具身智能 2026:启元人形机器人开发者生态的“安卓时刻”来了吗

一个贯穿全文的问题:人形机器人开发者生态,是否正从「封闭垂直」走向「开源平台化」?本文以开源底座的公开数据为标尺,盘点 SDK、URDF、仿真与技能分发的开放程度,并落回启元机器人的开源路径。所有关键数据均标注来源,文末附社区与学堂链接。

在北风吹起的时候加入我们的队伍 在秋雨到来的时候成为彼此的温暖 749

从零搭建Obsidian智能知识库:Ollama本地模型与Copilot插件实战指南

本文详细介绍了如何从零搭建Obsidian智能知识库,结合Ollama本地模型与Copilot插件实现高效知识管理。通过本地部署AI助手,用户可以在保证隐私安全的同时,快速检索和整理笔记,提升工作效率。文章涵盖硬件准备、Ollama部署、插件配置及实战技巧,适合需要高效知识管理的专业人士。

weixin_29230773的博客 631

UE5多人联机实战:从零搭建LAN游戏房间(含UMG界面配置)

本文详细介绍了如何在UE5中从零开始搭建一个完整的局域网(LAN)多人游戏房间系统。内容涵盖项目基础配置、UMG主菜单设计、会话创建与搜索的核心实现,并重点解析了创建会话的关键参数配置与常见陷阱,帮助开发者快速掌握UE5多人联机开发的核心流程。

weixin_29001683的博客 690

android-ad-cleaner:android免 Root 批量关闭系统开屏与营销推送

橘子,计算机视觉方向工程师,深耕 AIGC 与多媒体处理领域,专注技术实用化落地。本文为原创内容,转载请注明来源与作者。优快云 首发 | 版权所有 © 2026。

下载资源或查看教程前,请务必阅读置顶的《免责声明》 523

Altium Designer操作技巧(1)——原理图中如何批量替换元器件?

《AltiumDesigner批量替换元器件技巧分享》摘要:本文介绍了两种在AltiumDesigner中批量替换元器件的实用方法。方法一通过“查找相似对象”功能,可精准匹配并批量修改器件参数;方法二利用ActiveBOM功能,在BOM表中直观操作器件替换,推荐使用第二种方法可使BOM管理更高效。这些技巧能有效减少物料种类、降低贴装成本,特别适用于电阻电容等常用器件的批量替换。关注公众号获取更多电子设计技巧。

u012526819的博客 2578

Android 14 SELinux策略深度解析

init 的全局公开约束(如 neverallow init execute_no_trans,放 public 才能约束所有分区的规则)这就是"哪些可见"的强制机制。alps_s0(MTK 工程)的 device/mediatek/sepolicy/basic/ 提供。所有分区(system/system_ext/product/vendor)都可引用。init的公开约束、跨分区共用的 type/attribute/neverallow。——vendor 的 .cil 只能引用 plat 的。

新时代农民工 103

Telegram Bot Api使用教程

其中token为你的机器人token,method为telegram给定的方法,在获取群组chat_id那一步就使用了telegram的其中一个方法(getUpdates),其他方法后面会介绍。telegram发送消息的方式类似与钉钉机器人,都是向一个api发送http请求,而且对于同一个APItelegram支持GET和POST两种请求方式.请求的api格式如下。通常来说我们都需要让机器人在一个群组里工作,所以首先我们需要将机器人添加到我们指定的群组,在群组里发送随意消息并@这个机器人,比如...

豫迷糊的码上生活 1万+

【2.12】基于FPGA的Gardner环开发5——闭环反馈,获得完整gardner环

本文介绍了Gardner定时恢复算法在FPGA上的实现过程。首先回顾MATLAB程序中Gardner环的闭环反馈机制,重点分析了环路滤波器输出变量w的处理流程。随后详细阐述了FPGA实现的Verilog设计步骤,包括三个核心模块:1)y_temp=q0-w计算模块,实现反馈变量处理;2)uk=2*q0计算模块,生成插值系数;3)插值计算模块,根据使能信号执行线性插值运算。设计通过引入使能信号控制插值更新时机,采用定点数运算处理数据,并包含负数保护机制确保计算稳定性。文章提供了完整的Verilog代码实现,展

fpga/matlab/simulink算法仿真工程 135

Android 开发入门实践(二):Kotlin 空安全,从可空类型到安全访问

延续 NewsApp 项目中的新闻标题练习,记录 Kotlin 安全调用。

Easyhood的博客 277

科研级YOLO26下采样革新:ContextGuided模块赋能,让特征降维兼具上下文感知的实战指南

在文件夹下新建,将上述类的代码写入其中。这一步是为了让YOLO26的代码架构能识别我们的自定义下采样模块。

LXY_LOVE36的博客 100

Android 模块化收口:能力组合框架、手写 LifecycleOwner 与热修复共存

二十多个模块业务高度相似却各有差异,核心矛盾在于“统一与灵活”的平衡。通过角色接口组合(如IProjectAware、IVoiceAware)实现能力按需注入,新增功能零侵入;用模板方法锁定生命周期流程,确保顺序一致;结合@CallSuper与工厂方法,既约束关键逻辑,又保留子类自由。最终实现:骨架统一、填空自由,管得住业务,又不侵入业务。

mmsx990的博客 395

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Android Message源码阅读

本文梳理了Android Handler机制中Message的核心设计:链表结构、消息复用池(sPool)及回收机制,重点解析了异步消息与同步屏障(SyncBarrier)的协同机制。当主线程需优先处理UI绘制等高优先级任务时,系统通过postSyncBarrier插入屏障,使Looper跳过普通同步消息,优先执行标记为异步的UI渲染任务,确保帧率流畅。该机制是保障Android界面响应性的关键技术之一。

u012116089的博客 190

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

安卓部署Linux性能实测:一颗移动处理器,能否胜任日常 Linux 开发?

本文通过在一加Ace5上部署NimoteCode的ARM64 Linux环境,测试了其在CoreMark、SQLite编译及并行构建中的表现。结果显示,尽管单核性能约2.34GHz,多核扩展比达6.15×,但优化编译耗时仍高达35秒,反映移动处理器虽具备一定开发能力,却受限于文件系统开销与运行环境(如PRoot)。实际开发中,非优化构建效率较高,而并行编译可显著提速。结论:安卓手机可作为轻量级开发辅助工具,但无法替代桌面环境,真正价值在于便携性与即时响应,而非全功能替代。

一个不知名码农的专栏 287

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Android 17 全栈性能分析关键字与源码手册

FrameTimeline 找异常帧,ATrace 找阶段,thread_state 找等待类型,ftrace 找内核原因,Simpleperf 找 CPU 热点,驱动源码找最终触发条件;任何根因结论都必须回到同一对象、同一时间窗口和同一条依赖链。

weixin_43228946的博客 363

Android 开发入门实践(九):把新闻数据与页面状态交给 ViewModel

本文记录第110—117课学习成果:将页面标题、新闻列表及选中编号逐步迁移至NewsViewModel,通过ViewModelProvider获取实例并读取数据。页面调用ViewModel方法处理选择与返回,实现状态管理解耦。过程中纠正了对Activity重建机制的误解,并厘清mutableStateOf的可观察性与ViewModel对象生命周期的区别,深化了对Compose状态更新机制的理解。

Easyhood的博客 217

云手机私有化部署完整方案:基于ARM服务器搭建私有安卓云集群

ARM 服务器是私有化安卓云集群最优硬件底座,原生架构匹配 Android,高密度、低损耗,非常适合企业内网场景。整套私有化方案的核心,从来不是 “跑起来安卓”,而是隔离可控、可审计、可运维、可扩容。两条路线各有取舍:开源自建灵活、门槛高;商用私有化交付开箱即用、安全能力完备,是当前企业生产环境主流方案。六边云手机私有化方案,补齐了自建方案在驱动适配、管控平台、审计合规、信创适配上的短板,适合对数据主权、内网隔离有强需求的政企、自研 App、垂直行业客户。

a598652的博客 311

CTF 命令执行题学习笔记:终端特殊字符 $IFS 与 %09 的用法(HelloCTF RCE-labs)

空格被过滤时:用%09(TAB)或$IFS代替空格关键词被过滤时:用通配符?或字符类[f]拼出被禁的词,让 WAF 在原始字符串里看不到它,shell 在执行时再展开这类技巧在后续的命令执行题里会反复用到,建议亲手在靶机上敲一遍感受一下。

YY888888_的博客 539

Android 顶点上传:Heap 到 Direct 的零拷贝,省的是 JNI 次数

一帧数十万次putFloat的性能瓶颈源于频繁跨JNI边界,每次开销远超传输字节数。通过将写入与上传解耦:用堆内ByteBuffer高速写入,最后一次性put(writeBuf)批量传至堆外DirectByteBuffer,将数百万次边界调用压缩为一次,实现近10倍性能提升。关键在于复用堆外缓冲区、统一端序,并结合“更新-绘制”分离,仅在数据变更时上传顶点,平移缩放时零开销重绘,彻底释放CPU瓶颈。

mmsx990的博客 474

Android 系统启动与调试中的日志抓取方式全解析

│ 用户操作/系统事件 ││ │▼ ▼│ (驱动/硬件/内存管理) │ │ (App/SystemServer) ││ │ │ ││ │▼ ▼│ dmesg 命令 │ │ logd daemon ││ cat /proc/kmsg │ │ (分类存储到分区) ││ │▼ ▼│ 串口 UART │ │ logcat 命令 ││ (硬件直连,最早输出) │ │ adb logcat ││ │▼│ (汇总所有日志+系统状态) │工具最佳用途关键优势主要局限dmesg。

zhaoshuzhaoshu的专栏 260

【Android】听写播放器改版:中英文书写速度拆项与「正在读」高亮

现象:把播放页主体抽成后,里面给LazyColumn加想让它占满剩余高度,编译报错(weight 不可用)。原因weight不是通用修饰符,是RowScope的扩展函数。是个普通函数,函数体里没有接收者,自然调不到。解决private fun ColumnScope.PlaybackBody(...) { /* 这里就能用 Modifier.weight(1f) */ }调用处仍在原来的Column { }里,无需改动。预防:Compose 的布局修饰符都是作用域绑定。

木头大左的博客 225

go消息推送之极光推送 (JPush REST API + SDK,覆盖安卓与iOS)

使用 gorush有个绕不开的问题:国内安卓设备上 FCM 基本不可达,华为、小米、OPPO、vivo 各自为政——此时可用极光推送(JPush)作解决方案。它的思路和前面几家都不一样:App 集成极光 SDK 后拿到统一的 RegistrationID,服务端发一条 REST 请求,极光云端自动把消息路由到 APNs、各家厂商通道或极光自有长连接。这里给出了:一个用纯标准库直接调用极光的;另一个用社区维护的,类型化参数,接口注释与官方文档逐条对应。两个功能相同,可放在一起对比学习。

qq_40467670的博客 167

Android 开发入门实践(十):用 Kotlin 协程完成模拟加载、取消与异常处理

本文记录第118—125课对NewsApp的协程改造:从viewModelScope.launch启动协程,逐步加入delay模拟等待、suspend函数封装、withContext(Dispatchers.IO)切换线程并观察上下文恢复机制。通过日志验证withContext完成后恢复原执行上下文(非自动回主线程),纠正了初始理解偏差。引入Job管理任务,实现加载取消与重复点击防护,结合异常处理与状态管理,完成可观察、可中断的异步流程。

Easyhood的博客 353

android 动画掉帧

动画

yeshen.org 236
上一篇: AndroidTraining学习------Saving-Data
下一篇: AndroidTraining学习------ShareFiles
guotao967
博客等级 码龄11年 1粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值