深入分析 Android Activity (十)

news2024/12/27 15:50:36

文章目录

    • 深入分析 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);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE mytable (id INTEGER PRIMARY KEY, name TEXT)");
    }

    @Override
    public 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> {
    @Override
    protected String doInBackground(Void... voids) {
        // Perform background operation
        return "Result";
    }

    @Override
    protected 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">
    
    <TextView
        android: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) {
    @Override
    protected 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 的其他部分,包括系统服务、组件通信、高级动画、性能调优等,将进一步提升应用开发能力和水平。

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

在这里插入图片描述

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

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

相关文章

生产者延迟消息和重试机制

messageDelayLevel1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h 延迟消息级别public PutMessageResult putMessage(final MessageExtBrokerInner msg) {//事务消息处理if (tranType MessageSysFlag.TRANSACTION_NOT_TYPE|| tranType MessageSysFlag.TRANSACT…

基于高光谱数据集的创新点实现-高斯核函数卷积神经网络

一、高光谱数据集简介 1.1 数据集简介 数据集链接在这:高光谱数据集(.mat.csv)-科研学术 数据集包含下面三个文件&#xff1a; 文件中包含.mat与.csv,145x145x220, 其实主要使用avirissub.csv文件&#xff0c;在代码上只是将mat文件转成了csv文件。具体avirissub.csv如下&am…

算法学习笔记(7.1)-贪心算法(分数背包问题)

##问题描述 给定 &#x1d45b; 个物品&#xff0c;第 &#x1d456; 个物品的重量为 &#x1d464;&#x1d454;&#x1d461;[&#x1d456;−1]、价值为 &#x1d463;&#x1d44e;&#x1d459;[&#x1d456;−1] &#xff0c;和一个容量为 &#x1d450;&#x1d44e;&…

【kubernetes】关于k8s集群如何将pod调度到指定node节点(亲和与反亲和等)

目录 一、调度约束 1.1K8S的 List-Watch 机制 ⭐⭐⭐⭐⭐ 1.1.1Pod 启动典型创建过程 二、调度过程 2.1Predicate&#xff08;预选策略&#xff09; 常见的算法 2.2priorities&#xff08;优选策略&#xff09;常见的算法 三、k8s将pod调度到指定node的方法 3.1指定…

白酒:传统产区的创新之路与品牌重塑

云仓酒庄豪迈白酒作为传统产区的品牌&#xff0c;面临着市场需求的不断变化和消费者口味的多样化。为了保持品牌竞争力和市场地位&#xff0c;传统产区需要不断创新和重塑品牌形象&#xff0c;以满足消费者的需求和期望。 首先&#xff0c;传统产区需要注重产品的品质和口感。品…

Owinps静态IP代理:跨境电商的优选解决方案

在快速发展的电子商务领域&#xff0c;尤其是跨境电商行业&#xff0c;网络的稳定性和安全性是成功经营的关键因素之一。在这背后&#xff0c;少不得一个重要的跨境电商工具——代理IP&#xff0c;而这其中&#xff0c;静态IP因其独特的稳定性和安全性&#xff0c;正逐渐成为众…

IC开发——Ubuntu安装VCS2018

1. 简介 VCS是一种常用的Verilog仿真和综合工具&#xff0c;由Synopsys公司开发。它提供了一个完整的设计验证环境&#xff0c;用于验证硬件设计的正确性和性能。以下是VCS工具的一些主要特点和功能&#xff1a; 仿真功能&#xff1a;VCS支持基于事件驱动的数字电路级仿真&am…

MySQL学习——连接服务器和输入查询

MySQL是一个流行的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;由瑞典的MySQL AB公司开发&#xff0c;后来被Oracle公司收购。它使用SQL&#xff08;结构化查询语言&#xff09;作为访问和操作数据库的标准语言。 要查看 mysql 客户端程序提供的选项列表&a…

合约的值类型

基本数据类型&#xff1a;整数、枚举、布尔&#xff08;类似java的数据类型&#xff09;Address、Contract&#xff08;这两种是solidity特有的数据类型&#xff09;Fixed byte array&#xff08;定长字节数组&#xff09; Integer(int/uint) int/uint 以8位字节递增&#xf…

硬盘有EFI分区格式化不了,也删不了怎么办,不能读取磁盘

问题&#xff1a;EFI为系统引导分区表明这是一块系统盘&#xff0c;常规操作无法格式化也无法删除&#xff0c;也不能读取 解决&#xff1a; 1.管理员运行cmd 2.输入diskpart 3.输入list disk 查看系统磁盘&#xff0c;并找到你格式化不了的那块磁盘 4.select disk 编号 选择…

【Go专家编程——并发控制——三剑客】

并发控制 我们考虑这么一种场景&#xff0c;协程在A执行过程中需要创建子协程A1、A2、A3…An&#xff0c;协程创建完子协程后就等待子协程退出。 针对这种场景&#xff0c;Go提供了三种解决方案&#xff1a; Channel&#xff1a;使用channel控制子协程 优点&#xff1a;实现…

【稳定检索】2024年核能科学与材料、物理应用国际会议(NESMPA 2024)

2024年核能科学与材料、物理应用国际会议 2024 International Conference on Nuclear Energy Science and Materials, Physical Applications 【1】会议简介 2024年核能科学与材料、物理应用国际会议即将拉开帷幕&#xff0c;这是一场汇聚全球核能科学、材料研究及物理应用领域…

全志T527 适配双目tp2815_mipi

一、硬件信息 TP2815&#xff1a; 确认硬件信息&#xff1a; 1、通信接口&#xff1a;TWI2总线&#xff0c;引脚组为PE1 、PE2 2、RESET脚&#xff1a; 二、软件配置 1、设备树 t527 dtsi: bsp/configs/linux-5.15/sun55iw3p1.dtsi t527 uboot-board.dts device/config/chi…

必看丨SSL证书是什么?怎么免费申请一张?

SSL证书是一种网络安全证书&#xff0c;它能帮助网站实现数据加密传输&#xff0c;保障用户信息在浏览器和网站服务器之间的安全交流。想象一下SSL证书就像一封密信的封蜡&#xff0c;确保信件内容在途中不会被他人偷看或篡改。 SSL证书的作用主要有两点&#xff1a; 1. 身份验…

gin框架精通篇(二)

原生数据库使用 导入模块&#xff1a;go get -u github.com/go-sql-driver/mysql 安装 mysql 数据库 安装数据库可能遇到的问题&#xff1a;&#xff08;网上的方法基本可以解决&#xff09; ERROR 1045 (28000): Access denied for user ‘-root’‘localhost’ (using passwo…

【leetcode2765--最长交替子数组】

要求&#xff1a;给定一个数组&#xff0c;找出符合【x, x1,x,x-1】这样循环的最大交替数组长度。 思路&#xff1a;用两层while循环&#xff0c;第一个while用来找到符合这个循环的开头位置&#xff0c;第二个用来找到该循环的结束位置&#xff0c;并比较一下max进行记录。 …

LLVM技术在GaussDB等数据库中的应用

目录 LLVM和数据库 LLVM适用场景 LLVM对所有类型的SQL都会有收益吗&#xff1f; LLVM在OLTP中就一定没有收益吗&#xff1f; GaussDB中的LLVM 1. LLVM在华为应用于数据库的时间线 2. GaussDB LLVM实现简析 3. GaussDB LLVM支持加速的场景 支持LLVM的表达式&#xff1a…

河南道路与桥梁乙级资质升级门槛条件解读

河南道路与桥梁乙级资质升级门槛条件解读如下&#xff1a; 一、企业基本条件 法人资格&#xff1a; 企业需具备独立企业法人资格&#xff0c;能够独立承担民事责任。注册资金&#xff1a; 企业的注册资金应不少于100万元人民币&#xff0c;这一数字直接体现了企业的经济实力和…

Yann LeCun 和 Elon Musk 就 AI 监管激烈交锋

&#x1f989; AI新闻 &#x1f680; Yann LeCun 和 Elon Musk 就 AI 监管激烈交锋 摘要&#xff1a;昨天&#xff0c;Yann LeCun 和Elon Musk 在社交媒体就人工智能的安全性和监管问题展开激烈辩论。LeCun 认为目前对 AI 的担忧和监管为时过早&#xff0c;主张开放和共享。而…

【linux:基础IO】

目录 系统调用的文件接口&#xff1a; open read: write: lseek: close: 系统调用的文件接口&#xff1a; open 当文件存在时&#xff1a;int open (const char*pathname,int flags)当文件不存在时&#xff1a;int open (const char* pathname,int flags,mode_t mode) 返…