1. Activity 的生命周期详解
Activity
的生命周期方法提供了一组回调,使开发者能够在不同状态下执行相应的逻辑。了解这些方法有助于开发者管理资源和确保应用程序的行为一致。
1.1 onCreate
onCreate
是 Activity
的入口点,系统在创建 Activity
时调用。这个方法是设置界面和初始化资源的最佳位置。
java
代码解读
复制代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Initialize resources
}
1.2 onStart
onStart
方法在 Activity
对用户可见时调用,但此时用户还无法进行交互。此方法适合开始准备界面所需的资源。
java
代码解读
复制代码
@Override
protected void onStart() {
super.onStart();
// Prepare resources that need to be visible to the user
}
1.3 onResume
onResume
方法在 Activity
准备好与用户进行交互时调用。此方法适合开始动画、音频播放等需要用户交互的操作。
java
代码解读
复制代码
@Override
protected void onResume() {
super.onResume();
// Resume animations, audio playback, etc.
}
1.4 onPause
onPause
方法在 Activity
即将停止与用户交互时调用。这是保存数据和停止动画等操作的好时机。
java
代码解读
复制代码
@Override
protected void onPause() {
super.onPause();
// Pause animations, save data, etc.
}
1.5 onStop
onStop
方法在 Activity
不再对用户可见时调用。此方法适合释放不再需要的资源。
java
代码解读
复制代码
@Override
protected void onStop() {
super.onStop();
// Release resources no longer needed
}
1.6 onDestroy
onDestroy
方法在 Activity
被销毁前调用。这里是进行最终清理的好地方。
java
代码解读
复制代码
@Override
protected void onDestroy() {
super.onDestroy();
// Clean up resources
}
1.7 onRestart
onRestart
方法在 Activity
从停止状态重新启动时调用。这里可以重新初始化在 onStop
方法中释放的资源。
java
代码解读
复制代码
@Override
protected void onRestart() {
super.onRestart();
// Re-initialize resources released in onStop
}
2. Activity 状态的保存与恢复
为了应对配置变化和进程被系统回收等情况,Activity
提供了 onSaveInstanceState
和 onRestoreInstanceState
方法来保存和恢复状态。
2.1 保存状态
onSaveInstanceState
在 Activity
即将被销毁时调用,用于保存临时状态信息。
java
代码解读
复制代码
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("key", "value");
}
2.2 恢复状态
onRestoreInstanceState
在 Activity
被重新创建后调用,用于恢复之前保存的状态信息。
java
代码解读
复制代码
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
String value = savedInstanceState.getString("key");
}
也可以在 onCreate
方法中恢复状态:
java
代码解读
复制代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
String value = savedInstanceState.getString("key");
}
}
3. Activity 的启动优化
在实际开发中,优化 Activity
的启动时间对于提升用户体验非常重要。以下是一些常见的优化技巧:
3.1 延迟初始化
将非关键资源的初始化延迟到用户实际需要的时候,从而减少 onCreate
方法的执行时间。
java
代码解读
复制代码
// Load non-critical data after the UI is rendered
private void loadNonCriticalData() {
new Handler().postDelayed(() -> {
// Load non-critical data here
}, 1000);
}
3.2 使用 ViewStub
对于可能不会立即显示的布局,可以使用 ViewStub
延迟加载。
xml
代码解读
复制代码
<ViewStub
android:id="@+id/view_stub"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout="@layout/your_layout"/>
在代码中加载:
java
代码解读
复制代码
ViewStub viewStub = findViewById(R.id.view_stub);
View inflatedView = viewStub.inflate();
3.3 分析启动性能
使用 Android Profiler 分析 Activity
的启动性能,找到并优化瓶颈。
java
代码解读
复制代码
// Profile your app to identify performance bottlenecks
4. 深入理解 Activity 的窗口管理
4.1 Window
Window
是 Activity
管理视图的顶级窗口,Activity
使用 PhoneWindow
类来实现。Window
管理状态栏、标题栏和内容区域。
4.2 WindowManager
WindowManager
是一个系统服务,负责管理窗口。通过 WindowManager
可以控制窗口的布局参数。
java
代码解读
复制代码
Window window = getWindow();
WindowManager.LayoutParams params = window.getAttributes();
params.height = WindowManager.LayoutParams.MATCH_PARENT;
params.width = WindowManager.LayoutParams.MATCH_PARENT;
window.setAttributes(params);
5. Activity 的任务和返回栈管理
Android 使用任务和返回栈来管理 Activity
的导航。每个任务由一个栈来管理 Activity
。
5.1 启动 Activity 的 Intent 标志
使用 Intent
标志控制 Activity
的启动行为和返回栈。例如:
FLAG_ACTIVITY_NEW_TASK
:在新的任务中启动Activity
。FLAG_ACTIVITY_CLEAR_TOP
:如果目标Activity
已经在栈中存在,则将其上面的所有Activity
清除。
java
代码解读
复制代码
Intent intent = new Intent(this, MyActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
5.2 处理返回栈中的数据
使用 onActivityResult
方法处理从另一个 Activity
返回的数据:
java
代码解读
复制代码
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
String result = data.getStringExtra("key");
// Handle the result
}
}
在启动 Activity
时可以传递请求代码:
java
代码解读
复制代码
Intent intent = new Intent(this, AnotherActivity.class);
startActivityForResult(intent, REQUEST_CODE);
6. Activity 的内存管理
Android 系统会在内存不足时终止后台 Activity
,以释放资源。因此,必须在 onSaveInstanceState
和 onRestoreInstanceState
中保存和恢复关键数据。
6.1 内存泄漏检测
使用工具如 LeakCanary 进行内存泄漏检测:
java
代码解读
复制代码
// Add LeakCanary dependency in build.gradle
dependencies {
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7'
releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:2.7'
}
// Initialize LeakCanary in Application class
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
if (LeakCanary.isInAnalyzerProcess(this)) {
return;
}
LeakCanary.install(this);
}
}
7. Activity 的主题和样式
通过自定义主题和样式,可以统一管理 Activity
的外观和行为。
7.1 自定义主题
在 res/values/styles.xml
中定义自定义主题:
xml
代码解读
复制代码
<resources>
<style name="CustomTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
</resources>
在 AndroidManifest.xml
中应用自定义主题:
xml
代码解读
复制代码
<activity android:name=".MyActivity"
android:theme="@style/CustomTheme">
</activity>
7.2 动态切换主题
通过 recreate
方法动态切换 Activity
的主题:
java
代码解读
复制代码
// Change theme and recreate Activity
setTheme(R.style.CustomTheme);
recreate();
总结
Android Activity
的设计涵盖了生命周期管理、视图层次结构、任务和返回栈管理、内存管理、主题和样式等方面。理解这些概念和内部实现有助于开发者创建高效、稳定和响应迅速的应用程序。通过灵活应用这些知识,可以提升应用程序的用户体验和性能。
作者:我说HelloWorld
链接:https://juejin.cn/post/7382891667673022514
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。