文章目录
- 深入分析 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 的其他部分,包括系统服务、组件通信、高级动画、性能调优等,将进一步提升应用开发能力和水平。
欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力 |