深入分析 Android Activity (八)

文章目录

    • 深入分析 Android Activity (八)
    • 1. Activity 的资源管理
      • 1.1 使用资源 ID
      • 1.2 动态加载资源
      • 1.3 资源的本地化
      • 1.4 使用 TypedArray 访问资源
    • 2. Activity 的配置变更处理
      • 2.1 在 Manifest 文件中声明配置变更
      • 2.2 重写 `onConfigurationChanged` 方法
      • 2.3 保存和恢复实例状态
    • 3. Activity 的视图层次结构
      • 3.1 使用 View Hierarchy Inspector
      • 3.2 优化布局层次结构
      • 3.3 了解 View 的绘制流程
    • 4. Activity 的性能优化
      • 4.1 避免主线程阻塞
      • 4.2 使用 ViewStub 延迟加载
      • 4.3 优化布局渲染
    • 总结

深入分析 Android Activity (八)

1. Activity 的资源管理

在 Android 应用开发中,合理的资源管理可以提高应用的效率和用户体验。资源管理涉及到布局文件、字符串、图片、颜色等各种资源的使用和管理。

1.1 使用资源 ID

在代码中引用资源时,可以通过资源 ID 来访问这些资源。

// Accessing a string resource
String myString = getString(R.string.my_string);// Accessing a color resource
int myColor = ContextCompat.getColor(this, R.color.my_color);// Accessing a drawable resource
Drawable myDrawable = ContextCompat.getDrawable(this, R.drawable.my_drawable);

1.2 动态加载资源

动态加载资源在不同的场景中非常有用,比如根据用户选择加载不同的布局或图片。

// Dynamically loading a layout
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.my_layout, null);// Dynamically loading a drawable
Drawable drawable = getResources().getDrawable(R.drawable.my_drawable, getTheme());

1.3 资源的本地化

Android 提供了资源的本地化支持,可以根据用户的语言和地区自动加载相应的资源。

<!-- res/values/strings.xml -->
<string name="hello">Hello</string><!-- res/values-es/strings.xml -->
<string name="hello">Hola</string>
// Getting localized string resource
String hello = getString(R.string.hello);

1.4 使用 TypedArray 访问资源

TypedArray 是一种方便的方式,可以批量访问一组资源。

<!-- res/values/attrs.xml -->
<declare-styleable name="MyCustomView"><attr name="customColor" format="color" /><attr name="customSize" format="dimension" />
</declare-styleable>
// Accessing resources via TypedArray
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyCustomView);
int customColor = a.getColor(R.styleable.MyCustomView_customColor, Color.BLACK);
int customSize = a.getDimensionPixelSize(R.styleable.MyCustomView_customSize, 0);
a.recycle();

2. Activity 的配置变更处理

配置变更(如屏幕旋转、语言更改等)会导致 Activity 被销毁并重新创建。开发者可以通过重写 onConfigurationChanged 方法来处理特定配置变更,避免 Activity 重新创建。

2.1 在 Manifest 文件中声明配置变更

<activity android:name=".MyActivity"android:configChanges="orientation|screenSize|keyboardHidden">
</activity>

2.2 重写 onConfigurationChanged 方法

@Override
public void onConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig);// Handle configuration changesif (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {// Handle landscape orientation} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {// Handle portrait orientation}
}

2.3 保存和恢复实例状态

Activity 被销毁并重新创建时,可以使用 onSaveInstanceStateonRestoreInstanceState 保存和恢复实例状态。

@Override
protected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);outState.putString("key", "value");
}@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {super.onRestoreInstanceState(savedInstanceState);if (savedInstanceState != null) {String value = savedInstanceState.getString("key");// Use the restored data}
}

3. Activity 的视图层次结构

Activity 的视图层次结构由多个 ViewGroupView 组成。理解视图层次结构有助于优化布局和性能。

3.1 使用 View Hierarchy Inspector

Android Studio 提供了 View Hierarchy Inspector 工具,可以用来分析和调试视图层次结构。

// Use View Hierarchy Inspector to analyze the view hierarchy

3.2 优化布局层次结构

过多的嵌套布局会影响性能。使用 ConstraintLayout 可以减少嵌套层次,提高性能。

<!-- Using ConstraintLayout to reduce nesting -->
<ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello, World!"app:layout_constraintTop_toTopOf="parent"app:layout_constraintStart_toStartOf="parent" /></ConstraintLayout>

3.3 了解 View 的绘制流程

View 的绘制流程包括测量(measure)、布局(layout)和绘制(draw)。

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);// Measure child views
}@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {super.onLayout(changed, left, top, right, bottom);// Position child views
}@Override
protected void onDraw(Canvas canvas) {super.onDraw(canvas);// Draw view content
}

4. Activity 的性能优化

优化 Activity 的性能可以提高应用的响应速度和用户体验。

4.1 避免主线程阻塞

长时间的操作应在后台线程中完成,避免阻塞主线程。

// Performing a long-running operation on a background thread
new Thread(new Runnable() {@Overridepublic void run() {// Long-running operationfinal String result = performOperation();// Post result back to the main threadrunOnUiThread(new Runnable() {@Overridepublic void run() {// Update UI with the resulttextView.setText(result);}});}
}).start();

4.2 使用 ViewStub 延迟加载

ViewStub 是一个轻量级的视图,可以用来延迟加载布局。

<!-- Using ViewStub to delay load a layout -->
<ViewStubandroid:id="@+id/viewStub"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout="@layout/my_layout" />
// Inflating the ViewStub
ViewStub viewStub = findViewById(R.id.viewStub);
View inflated = viewStub.inflate();

4.3 优化布局渲染

减少布局层次和优化布局可以提高渲染性能。使用 ConstraintLayout 替代嵌套的 LinearLayoutRelativeLayout

<!-- Optimizing layout with ConstraintLayout -->
<ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello, World!"app:layout_constraintTop_toTopOf="parent"app:layout_constraintStart_toStartOf="parent" /></ConstraintLayout>

总结

通过对 Android Activity 的深入理解和灵活应用,可以实现丰富的用户体验和高效的应用程序。理解其生命周期、权限管理、数据传递、动画效果、导航和返回栈管理、资源管理、配置变更处理、视图层次结构、性能优化等方面的知识,有助于开发出性能优异且用户友好的应用程序。不断学习和实践这些知识,可以提升应用程序的质量和用户满意度。

欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网页图片加载慢的求解指南

网页/图片加载慢的求解指南 一、前言与问题描述 今天刚换上华为的HUAWEI AX3 Pro New&#xff0c;连上WIFI后测速虽然比平时慢&#xff0c;但是也不算太离谱&#xff0c;如下图所示&#xff1a; 估计读者们有也和作者一样&#xff0c;还没意识到事情的严重性&#x1f601;。 …

Android Display Graphics #1 整体框架介绍一

软件基础 Android的framework层提供了一系列的图像渲染API&#xff0c;可绘制2D和3D。简单理解就是上层开发APP的小伙伴提供了接口&#xff0c;开发者可以直接显示对应的自己内容。但如果掌握了Display底层逻辑再写上层app&#xff0c;会有掌控力&#xff0c;出问题可以根据lo…

【ai】chatgpt的plugin已经废弃

发现找不到按钮,原来是要申请: https://openai.com/index/chatgpt-plugins/ 发现申请已经跳转了,好像是废弃了? 不接受新插件了,但是openai的api 是可以继续用的。 https://openai.com/waitlist/plugins/We are no longer accepting new Plugins, builders can now create…

医疗小程序源码SpringBoot2.X + Vue + UniAPP全栈开发

源码说明&#xff1a; 看到好多坛友都在求SpringBoot2.X Vue UniAPP&#xff0c;全栈开发医疗小程序 – 带源码课件&#xff0c;我看了一下&#xff0c;要么链接过期&#xff0c;要么课件有压缩密码。 特意整理了一份分享给大家&#xff0c;个人认为还是比较全面的。 希望…

最后两天!百度云加速正式停服

百度云加速将于5月30日&#xff0c;正式关闭服务器&#xff0c;仅保留官网首页通知。 届时如网站还在百度云加速接入的&#xff0c;将无法正常访问&#xff01; 如果您还有域名在百度云加速接入的请尽快做迁移安排&#xff0c;以免造成损失。 目前在主机吧购买的域名已经全部…

使用华为快传同步文件至电脑

使用华为快传同步文件至电脑&#xff0c;电脑端未发现设备解决办法 1、手机和电脑连同一网络 2、打开手机华为分享&#xff0c;打开电脑网络 3、网络中找到设备&#xff0c;输入账户密码进行连接&#xff08;未找到设备往下继续看&#xff09; 未找到设备解决办法&#xff1…

攒粒是什么?怎么用攒粒赚钱?

攒粒简介 攒粒的前身是91问问&#xff0c;隶属于上海道道永泉市场调查有限公司&#xff0c;是一家专业的全球在线调研服务公司&#xff0c;也是是国内排名前列的社区调查之一&#xff0c;10年在线调研&#xff0c;600万会员亲身体验&#xff0c;提供网络调查、市场调查、问卷调…

Go源码--sync库(1)

简介 这篇主要介绍 sync.Once、sync.WaitGroup和sync.Mutex sync.Once once 顾名思义 只执行一次 废话不说 我们看源码 英文介绍直接略过了 感兴趣的建议读一读 获益匪浅 其结构体如下 Once 是一个严格只执行一次的object type Once struct {// 建议看下源码的注解&#xf…

联想应用商店开发者常见问题FAQ

Phone/Pad应用常见问题 应用上传FAQ Q. 上传apk包时&#xff0c;提示“该包名已存在”如何处理&#xff1f; A&#xff1a;若应用包名出现冲突&#xff0c;请先核实该账号是否已存在该包名产品&#xff0c;若不在该账号下&#xff0c;请进行应用认领。 Q. 应用是否可以授权…

AI图书推荐:用ChatGPT和Python搭建AI应用来变现

《用ChatGPT和Python搭建AI应用来变现》&#xff08;Building AI Applications with ChatGPT API&#xff09;将ChatGPT API与Python结合使用&#xff0c;可以开启构建非凡AI应用的大门。通过利用这些API&#xff0c;你可以专注于应用逻辑和用户体验&#xff0c;而ChatGPT强大的…

爬虫技术升级:如何结合DrissionPage和Auth代理插件实现数据采集

背景/引言 在大数据时代&#xff0c;网络爬虫技术已经成为数据收集的重要手段之一。爬虫技术可以自动化地从互联网上收集数据&#xff0c;节省大量人力和时间成本。然而&#xff0c;当使用需要身份验证的代理服务器时&#xff0c;许多现有的爬虫框架并不直接支持代理认证。这就…

three.js能实现啥效果?看过来,这里都是它的菜(11)

Hi&#xff0c;这是three.js动画效果第十一期分享了。 在 Three.js 中创建光线流边动画可以通过使用 ShaderMaterial 和自定义的着色器程序来实现。下面是一个简单的示例代码&#xff0c;演示了如何在 Three.js 中创建光线流边动画&#xff1a; // 创建场景 var scene new T…

【Qt】事件

文章目录 1 :peach:事件介绍:peach:2 :peach:事件的处理:peach:3 :peach:按键事件:peach:3.1 :apple:单个按键:apple:3.2 :apple:组合按键:apple: 4 :peach:鼠标事件:peach:4.1 :apple:鼠标单击事件:apple:4.2 :apple:鼠标释放事件:apple:4.3 :apple:鼠标双击事件:apple:4.4 :a…

python下载安装教程(最新图文下载)__python下载

一、下载安装包 官网下载&#xff0c;下载流程参考下面截图。 下载安装python安装包&#xff0c;网盘点此下载&#xff1a;&#xff1a;点击此处直接下载 点击图片中的“Download”按钮&#xff0c;然后选择需要下载的版本&#xff0c;最后在跳转的页面中&#xff0c;选择你…

VM中Ubuntu16.04的下载以及ROS—kinetic的版本下载

一、Ubuntu镜像地址 转载备份一下&#xff1b; 官方下载地址&#xff08;不推荐&#xff09; https://www.ubuntu.com/downloadhttps://www.ubuntu.com/download 中科大源 Index of /ubuntu-releases/16.04/http://mirrors.ustc.edu.cn/ubuntu-releases/16.04/ 阿里云开…

【Leetcode 160】环形链表——双指针,细节讲解

题目 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&#…

Web安全:文件上传漏洞详解,文件上传漏洞原理、绕过方式和防御方案。

「作者简介」&#xff1a;2022年北京冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础对安全知识体系进行总结与归纳&#xff0c;著作适用于快速入门的 《网络安全自学教程》&#xff0c;内容涵盖系统安全、信息收集等…

在XP/Vista系统下使用Node.js的babel-cli命令行工具转码ES6语法的js文件,让IE8浏览器也能运行

在XP系统下IE浏览器最高只能装到IE8&#xff0c;在Vista系统下最高只能装到IE9。 2015年以后&#xff0c;JavaScript新增了很多语法&#xff0c;比如class、extends&#xff0c;还有let和const等等&#xff0c;这些语法都是XP下的终端浏览器IE8所不支持的。要想让使用了这些新式…

【Django】中间件实现钩子函数预处理和后处理,局部装饰视图函数

在app文件夹里新建middleware.py继承MiddlewareMixin&#xff0c; 编写中间件类&#xff0c;重写process_request、process_response钩子函数 from django.http import HttpRequest, HttpResponse from django.utils.decorators import decorator_from_middleware from django…

NAT 网络转换

NAT(Network Address Translation) 网络地址转换 0x01 NAT 简介 为什么要使用 NAT IPv4 网络地址紧缺&#xff0c;从而出现了私有网段&#xff0c;来补充地址&#xff0c;但私有网段不课访问 internet 所以出现了 NAT 地址转换&#xff0c;将私有地址&#xff0c;转换为公网 I…