深入分析 Android Activity (十)

1. Activity 的资源管理

在 Android 中,资源管理是开发中不可忽视的一部分。合理地管理资源(如布局、字符串、图像等),可以显著提升应用的性能和可维护性。

1.1 使用资源 ID 访问资源

可以通过资源 ID 来访问资源文件,如字符串、颜色、尺寸等。

java 复制代码
// 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 等。

xml 复制代码
<!-- res/drawable/rounded_corners.xml -->
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="8dp"/>
    <solid android:color="#FF0000"/>
</shape>
java 复制代码
// 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 中定义属性。

xml 复制代码
<!-- res/values/attrs.xml -->
<declare-styleable name="MyCustomView">
    <attr name="customText" format="string"/>
    <attr name="customColor" format="color"/>
</declare-styleable>
java 复制代码
// 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 使用资源配置

可以根据不同的设备配置提供不同的资源文件,如不同语言、屏幕尺寸、屏幕密度等。

xml 复制代码
<!-- 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 用于存储简单的键值对数据。

java 复制代码
// 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 文件存储

可以在内部或外部存储中存储文件。

java 复制代码
// 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 数据库用于存储结构化数据。

java 复制代码
// 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 用于在应用间共享数据。

java 复制代码
// 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 等在后台线程执行耗时操作。

java 复制代码
// 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 工具分析和优化布局。

xml 复制代码
<!-- 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 内存优化

内存优化可以防止内存泄漏和应用崩溃。

java 复制代码
// 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 等工具监测和分析性能。

java 复制代码
// 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 的其他部分,包括系统服务、组件通信、高级动画、性能调优等,将进一步提升应用开发能力和水平。


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

相关推荐
Kapaseker8 小时前
你不看会后悔的2025年终总结
android·kotlin
alexhilton11 小时前
务实的模块化:连接模块(wiring modules)的妙用
android·kotlin·android jetpack
ji_shuke11 小时前
opencv-mobile 和 ncnn-android 环境配置
android·前端·javascript·人工智能·opencv
sunnyday042613 小时前
Spring Boot 项目中使用 Dynamic Datasource 实现多数据源管理
android·spring boot·后端
幽络源小助理14 小时前
下载安装AndroidStudio配置Gradle运行第一个kotlin程序
android·开发语言·kotlin
inBuilder低代码平台15 小时前
浅谈安卓Webview从初级到高级应用
android·java·webview
豌豆学姐15 小时前
Sora2 短剧视频创作中如何保持人物一致性?角色创建接口教程
android·java·aigc·php·音视频·uniapp
白熊小北极15 小时前
Android Jetpack Compose折叠屏感知与适配
android
HelloBan15 小时前
setHintTextColor不生效
android
洞窝技术17 小时前
从0到30+:智能家居配网协议融合的实战与思考
android