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


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

相关推荐
阿华-vitor1 小时前
自定义控件之动画篇(六)——联合动画的代码及xml实现
android·xml·gitee
baozongwi3 小时前
ctfshow web sql注入 web242--web249
android·数据库·经验分享·sql·mysql·web安全
Dnelic-4 小时前
Android 15 应用适配默认全屏的行为变更(Android V的新特性)
android·ui·view·应用开发·android 15·android应用开发
svygh1236 小时前
安卓h5打包系统设计
android·html5·打包
人民的石头6 小时前
Android studio 打包低版本的Android项目报错
android·ide·android studio
xiangxiongfly9157 小时前
Android 换肤之主题换肤
android·换肤·主题换肤
Freeze-hu12 小时前
qt for android 工程添加AndroidManifest.xml 文件
android·xml
H10015 小时前
手机系统设置选项
android
coder_pig15 小时前
跟🤡杰哥一起学Flutter (十九、Flutter混编杂谈[Android]😫)
android·flutter·harmonyos
工程师老罗16 小时前
Android线性布局的概念与属性
android