深入分析 Android Activity (十)
文章目录
- 深入分析 Android Activity (十)
- 1. Activity 的资源管理
- 1.1 使用资源 ID 访问资源
- 1.2 Drawable 资源
- 1.3 使用 TypedArray 管理资源
- 1.4 使用资源配置
- 2. Activity 的数据存储
- 2.1 SharedPreferences
- 2.2 文件存储
- 2.3 SQLite 数据库
- 2.4 ContentProvider
- 3. Activity 的性能优化
- 3.1 避免主线程阻塞
- 3.2 优化布局
- 3.3 内存优化
- 3.4 性能监测工具
- 总结
深入分析 Android Activity (十)
1. Activity 的资源管理
在 Android 中,资源管理是开发中不可忽视的一部分。合理地管理资源(如布局、字符串、图像等),可以显著提升应用的性能和可维护性。
1.1 使用资源 ID 访问资源
可以通过资源 ID 来访问资源文件,如字符串、颜色、尺寸等。
// Accessing string resources
String myString = getResources().getString(R.string.my_string);// Accessing color resources
int myColor = getResources().getColor(R.color.my_color);// Accessing dimension resources
float myDimension = getResources().getDimension(R.dimen.my_dimension);
1.2 Drawable 资源
Drawable 资源用于定义应用中的图形元素。可以在 XML 文件中使用不同类型的 Drawable,如 shape、selector、layer-list 等。
<!-- res/drawable/rounded_corners.xml -->
<shape xmlns:android="http://schemas.android.com/apk/res/android"><corners android:radius="8dp"/><solid android:color="#FF0000"/>
</shape>
// Setting drawable resource to a view
ImageView imageView = findViewById(R.id.my_image_view);
imageView.setImageResource(R.drawable.rounded_corners);
1.3 使用 TypedArray 管理资源
TypedArray 用于访问一组类型相同的资源,如在自定义 View 中定义属性。
<!-- res/values/attrs.xml -->
<declare-styleable name="MyCustomView"><attr name="customText" format="string"/><attr name="customColor" format="color"/>
</declare-styleable>
// Accessing custom attributes in a custom view
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyCustomView);
String customText = a.getString(R.styleable.MyCustomView_customText);
int customColor = a.getColor(R.styleable.MyCustomView_customColor, Color.BLACK);
a.recycle();
1.4 使用资源配置
可以根据不同的设备配置提供不同的资源文件,如不同语言、屏幕尺寸、屏幕密度等。
<!-- res/values-en/strings.xml -->
<resources><string name="app_name">MyApp</string>
</resources><!-- res/values-zh/strings.xml -->
<resources><string name="app_name">我的应用</string>
</resources><!-- res/values-sw600dp/strings.xml -->
<resources><string name="app_name">MyApp for Tablets</string>
</resources>
2. Activity 的数据存储
在 Android 中,可以通过多种方式存储数据,如 SharedPreferences、文件存储、SQLite 数据库、ContentProvider 等。
2.1 SharedPreferences
SharedPreferences 用于存储简单的键值对数据。
// Saving data to SharedPreferences
SharedPreferences sharedPreferences = getSharedPreferences("MyPrefs", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("key", "value");
editor.apply();// Retrieving data from SharedPreferences
String value = sharedPreferences.getString("key", "default_value");
2.2 文件存储
可以在内部或外部存储中存储文件。
// Saving a file to internal storage
String filename = "myfile.txt";
String fileContents = "Hello, World!";
FileOutputStream fos = openFileOutput(filename, Context.MODE_PRIVATE);
fos.write(fileContents.getBytes());
fos.close();// Reading a file from internal storage
FileInputStream fis = openFileInput(filename);
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader bufferedReader = new BufferedReader(isr);
StringBuilder stringBuilder = new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) != null) {stringBuilder.append(line);
}
String fileContents = stringBuilder.toString();
2.3 SQLite 数据库
SQLite 数据库用于存储结构化数据。
// Defining a SQLiteOpenHelper class
public class MyDatabaseHelper extends SQLiteOpenHelper {private static final String DATABASE_NAME = "mydatabase.db";private static final int DATABASE_VERSION = 1;public MyDatabaseHelper(Context context) {super(context, DATABASE_NAME, null, DATABASE_VERSION);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("CREATE TABLE mytable (id INTEGER PRIMARY KEY, name TEXT)");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {db.execSQL("DROP TABLE IF EXISTS mytable");onCreate(db);}
}// Using the database
MyDatabaseHelper dbHelper = new MyDatabaseHelper(this);
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", "John Doe");
long newRowId = db.insert("mytable", null, values);
2.4 ContentProvider
ContentProvider 用于在应用间共享数据。
// Querying data from a ContentProvider
Uri uri = Uri.parse("content://com.example.myprovider/mytable");
Cursor cursor = getContentResolver().query(uri, null, null, null, null);
if (cursor != null) {while (cursor.moveToNext()) {String name = cursor.getString(cursor.getColumnIndex("name"));}cursor.close();
}
3. Activity 的性能优化
性能优化是确保应用流畅运行的重要步骤。可以通过以下方法进行性能优化:
3.1 避免主线程阻塞
在主线程中进行耗时操作会导致应用卡顿。可以使用 AsyncTask、HandlerThread、IntentService 等在后台线程执行耗时操作。
// Using AsyncTask to perform background operations
private class MyAsyncTask extends AsyncTask<Void, Void, String> {@Overrideprotected String doInBackground(Void... voids) {// Perform background operationreturn "Result";}@Overrideprotected void onPostExecute(String result) {// Update UI with result}
}new MyAsyncTask().execute();
3.2 优化布局
复杂的布局会影响性能。可以使用 Hierarchy Viewer 工具分析和优化布局。
<!-- Using ConstraintLayout to optimize layout -->
<ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><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 内存优化
内存优化可以防止内存泄漏和应用崩溃。
// Using LruCache for caching images
LruCache<String, Bitmap> memoryCache = new LruCache<String, Bitmap>(cacheSize) {@Overrideprotected int sizeOf(String key, Bitmap bitmap) {return bitmap.getByteCount() / 1024;}
};public void addBitmapToMemoryCache(String key, Bitmap bitmap) {if (getBitmapFromMemCache(key) == null) {memoryCache.put(key, bitmap);}
}public Bitmap getBitmapFromMemCache(String key) {return memoryCache.get(key);
}
3.4 性能监测工具
可以使用 Android Profiler、Systrace、GPU Profiler 等工具监测和分析性能。
// Enabling StrictMode to detect performance issues
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectAll().penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll().penaltyLog().build());
总结
通过对 Android Activity 的深入理解和灵活应用,可以实现丰富的用户体验和高效的应用程序。理解其生命周期、权限管理、数据传递、动画效果、导航和返回栈管理、资源管理、配置变更处理、视图层次结构、性能优化、内存管理、测试、Service 交互、BroadcastReceiver 交互、深度链接、任务返回栈管理、资源管理、数据存储和性能优化等方面的知识,有助于开发出性能优异且用户友好的应用程序。不断学习和实践这些知识,可以提升应用程序的质量和用户满意度。
继续深入探讨 Android 的其他部分,包括系统服务、组件通信、高级动画、性能调优等,将进一步提升应用开发能力和水平。
| 欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力 |

相关文章:
深入分析 Android Activity (十)
文章目录 深入分析 Android Activity (十)1. Activity 的资源管理1.1 使用资源 ID 访问资源1.2 Drawable 资源1.3 使用 TypedArray 管理资源1.4 使用资源配置 2. Activity 的数据存储2.1 SharedPreferences2.2 文件存储2.3 SQLite 数据库2.4 ContentProvider 3. Activity 的性能…...
考试“挂了“用日语怎么说,柯桥商务日语培训
1、もえる 热衷于……,燃烧 除了“燃烧”,还有“热衷于……”的意思,如“家が燃える(房子着火了)”,“勉強に燃える(热衷于学习)”。 A:今(いま&…...
【机器学习300问】103、简单的经典卷积神经网络结构设计成什么样?以LeNet-5为例说明。
一个简单的经典CNN网络结构由:输入层、卷积层、池化层、全连接层和输出层,这五种神经网络层结构组成。它最最经典的实例是LeNet-5,它最早被设计用于手写数字识别任务,包含两个卷积层、两个池化层、几个全连接层,以及最…...
【代码随想录算法训练营第37期 第二十一天 | LeetCode530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先】
代码随想录算法训练营第37期 第二十一天 | LeetCode530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先 一、530.二叉搜索树的最小绝对差 解题代码C: /*** Definition for a binary tree node.* struct TreeNode {* int val;* …...
2023 年网络等级保护考试题库及答案
一、单项选择题 1.在等保 1.0 的根本要求中,网络设备防护的内容归属于网络安全,在等保 2.0 中将其归属到〔〕。 A 安全通信网络 B 安全区域边界 C 安全计算环境 D 安全治理中心 答案:c 2.应成立指导和治理网络安全工作的委员会或领导小组&…...
springboot集成nacos
springboot集成nacos 1.版本2. POM依赖3. nacos服务3.1 下载nacos压缩包3.2 启动nacos 4. yaml配置5.Demo5.1 配置中心简单格式获取方式普通方式还可以再启动类上添加注解完成5.2 获取json格式的demo5.2 自动注册根据yaml配置 1.版本 nacos版本:2.3.2 springboot版本ÿ…...
NoSQL数据库技术与应用 教学设计
《NoSQL数据库技术与应用》 教学设计 课程名称:NoSQL数据库技术与应用 授课年级: 20xx年级 授课学期: 20xx学年第一学期 教师姓名: 某某老师 2020年5月6日 课题 名称 第1章 初识NoSQL 计划 学时 3 课时 内容 分析 随着云计算、…...
比较(一)利用python绘制条形图
比较(一)利用python绘制条形图 条形图(Barplot)简介 条形图主要用来比较不同类别间的数据差异,一条轴表示类别,另一条则表示对应的数值度量。 快速绘制 基于seaborn import seaborn as sns import matplo…...
【面试】Oracle JDK和Open JDK什么关系?
目录 1. 起源与发展2. 代码与许可3. 功能与组件4. 使用场景5. 版本更新与支持 1. 起源与发展 1.Oracle JDK是由Oracle公司基于Open JDK源代码开发的商业版本。2.Open JDK是java语言的一个开源实现。 2. 代码与许可 1.Oracle JDK包含了闭源组件,并根据二进制代码许…...
科学技术创新杂志科学技术创新杂志社科学技术创新编辑部2024年第10期目录
科技创新 单桩穿越岩溶发育地层力学特征与溶洞处置措施研究 刘飞; 1-7《科学技术创新》投稿:cnqikantg126.com 基于多目标优化的中低压配电网电力规划研究 向星山;杨承俊;张寒月; 8-11 激光雷达测绘技术在工程测绘中的应用研究 张军伟;闫宏昌; 12-15 …...
ES数据导出成csv文件
推荐使用es2csv 工具。 命令行实用程序,用Python编写,用于用Lucene查询语法或查询DSL语法查询Elasticsearch,并将结果作为文档导出到CSV文件中。该工具可以在多个索引中查询批量文档,并且只获取选定的字段,这减少了查…...
结构型设计模式之装饰模式
文章目录 概述装饰模式原理代码案例小结 概述 装饰模式(decorator pattern) 的原始定义是:动态的给一个对象添加一些额外的职责. 就扩展功能而言,装饰器模式提供了一种比使用子类更加灵活的替代方案。 装饰模式原理 装饰模式中的角色: 抽象构件角色 …...
Java - 当年很流行,现在已经淘汰的 Java 技术,请不要在继续学了!!!
最近这段时间收到了一些读者的私信,问我某个技术要不要学,还有一些在国外的同学竟然对 Java 图形化很感兴趣,还想找这方面的工作。 比较忙,一直没抽出时间去回答这类问题,刚好看到我关注的一位大佬回答过,这…...
驻波比VSWR
最近看大家写的VSWR文章,发现有很多误解, 1)错误解释是入射波和反射波叠加的驻波的波峰/波谷。大家可以向下驻波也是正弦波,波峰和波谷的值不都是振幅吗?因此相当于VSWR恒等于1了。 2)VSWR越小越好; 正确…...
多线程-线程池
为什么要使用线程池 在Java中使用线程池的主要原因有以下几点: 提高性能:使用线程池可以减少线程的创建和销毁过程的开销。线程的创建和销毁是比较昂贵的操作,如果每次需要执行任务时都创建一个新线程,会造成系统资源的浪费。而线…...
护网期间遇到的几个上传bypass waf、edr
1. weblogic部署war的时候 http/1.1 改成http/2绕过waf 其实jar和ear部署应该也可以,但是我没成功。 weblogoic 部署war死活出错,用linux下的浏览器 linux下打包war马 zip -r zipjob4.zip job/ mv zipjob3.zip zipjob3.war 然后部署成功之后&am…...
简述MVC模式
这里为什么讲MVC模式,是因为在学习的过程中,很多人不知怎的,将观察者模式和MVC混为一谈。MVC模式最开始出现在WEB开发中,该模式能够很好的做到软件模块的高内聚,低耦合,所以其思想逐渐在各个软件开发领域都…...
C#--Mapster(高性能映射)用法
1.Nuget安装Mapster包引用 2.界面XAML部分 <Window x:Class"WpfApp35.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.m…...
mysql实战——Mysql8.0高可用之双主+keepalived
一、介绍 利用keepalived实现Mysql数据库的高可用,KeepalivedMysql双主来实现MYSQL-HA,两台Mysql数据库的数据保持完全一致,实现方法是两台Mysql互为主从关系,通过keepalived配置VIP,实现当其中的一台Mysql数据库宕机…...
关于同一个地址用作两个不同页面时,列表操作栏按钮混淆状态
同一个地址用作两个不同页面时,列表页的操作栏中有好多个按钮,如果用了v-if,可能会导致按钮混淆状态如disabled等属性混乱 解决方法1: 将v-if换成v-show,用了v-show之后意味着所有按钮都在只是在页面上隐藏了 解决方…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...
