本文是Android四大组件系列的第一篇,主要介绍Activity的基本概念、生命周期以及实际应用场景。
Activity是Android应用程序的核心组件之一,它提供了一个用户界面,让用户可以与应用程序进行交互。从用户体验的角度来看,Activity就像是应用程序的"窗口"或"页面"。一个Android应用通常由多个Activity组成,它们之间可以相互跳转,共同构成了应用的用户界面流程。
要创建一个Activity,需要完成以下步骤:
Activity
或其子类(如AppCompatActivity
)onCreate()
AndroidManifest.xml
中声明该Activity// 1. 创建Activity类
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置布局文件
setContentView(R.layout.activity_main);
// 初始化视图、设置监听器等
Button btnStart = findViewById(R.id.btn_start);
btnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 启动另一个Activity
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
});
}
}
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
intent-filter>
activity>
<activity android:name=".SecondActivity" />
application>
manifest>
Activity的生命周期是指从创建到销毁的整个过程,Android系统通过一系列回调方法来管理Activity的生命周期。了解这些生命周期方法对于开发高质量的Android应用至关重要。
主要的生命周期方法包括:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("LifeCycle", "onCreate called");
// 初始化操作:获取Intent数据、初始化视图、绑定数据等
if (savedInstanceState != null) {
// 恢复之前保存的状态
String savedText = savedInstanceState.getString("saved_text");
// 使用恢复的数据
}
}
适合做的事情:
注意事项:
@Override
protected void onStart() {
super.onStart();
Log.d("LifeCycle", "onStart called");
// Activity变为可见,但用户还不能与之交互
}
适合做的事情:
@Override
protected void onResume() {
super.onResume();
Log.d("LifeCycle", "onResume called");
// Activity获取焦点,用户可以与之交互
// 启动需要在前台运行的功能,如动画、相机预览等
}
适合做的事情:
@Override
protected void onPause() {
// 暂停或释放在onResume中启动的资源
// 保存关键数据,但要快速执行(不到1秒)
Log.d("LifeCycle", "onPause called");
super.onPause();
}
适合做的事情:
注意事项:
@Override
protected void onStop() {
// Activity完全不可见,可以执行较重的关闭操作
Log.d("LifeCycle", "onStop called");
super.onStop();
}
适合做的事情:
@Override
protected void onRestart() {
super.onRestart();
Log.d("LifeCycle", "onRestart called");
// Activity从停止状态重新变为可见前调用
// 之后会调用onStart()
}
适合做的事情:
@Override
protected void onDestroy() {
// 释放所有资源,防止内存泄漏
Log.d("LifeCycle", "onDestroy called");
super.onDestroy();
}
适合做的事情:
下面是一个完整的Activity生命周期示例,包含所有生命周期方法的实现和日志记录:
public class LifecycleDemoActivity extends AppCompatActivity {
private static final String TAG = "LifecycleDemoActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_lifecycle_demo);
Log.d(TAG, "onCreate called");
Button nextButton = findViewById(R.id.btn_next);
nextButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 启动另一个Activity
Intent intent = new Intent(LifecycleDemoActivity.this, SecondActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart called");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume called");
}
@Override
protected void onPause() {
Log.d(TAG, "onPause called");
super.onPause();
}
@Override
protected void onStop() {
Log.d(TAG, "onStop called");
super.onStop();
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "onRestart called");
}
@Override
protected void onDestroy() {
Log.d(TAG, "onDestroy called");
super.onDestroy();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
// 保存Activity状态
outState.putString("saved_text", "Some text to save");
Log.d(TAG, "onSaveInstanceState called");
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// 恢复Activity状态
String savedText = savedInstanceState.getString("saved_text");
Log.d(TAG, "onRestoreInstanceState called: " + savedText);
}
}
在Android系统中,当配置发生变化(如屏幕旋转)或系统内存不足时,Activity可能会被销毁并重新创建。为了提供良好的用户体验,我们需要保存和恢复Activity的状态。
@Override
protected void onSaveInstanceState(Bundle outState) {
// 保存视图状态
EditText editText = findViewById(R.id.edit_text);
outState.putString("input_text", editText.getText().toString());
// 保存自定义数据
outState.putInt("counter", mCounter);
outState.putParcelable("user_data", mUserData);
Log.d(TAG, "onSaveInstanceState called");
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// 恢复视图状态
String inputText = savedInstanceState.getString("input_text");
EditText editText = findViewById(R.id.edit_text);
editText.setText(inputText);
// 恢复自定义数据
mCounter = savedInstanceState.getInt("counter");
mUserData = savedInstanceState.getParcelable("user_data");
Log.d(TAG, "onRestoreInstanceState called");
}
Android Jetpack提供了ViewModel组件,它可以在配置变化时保存数据,避免重复加载:
// 定义ViewModel
public class MainViewModel extends ViewModel {
private MutableLiveData<Integer> counter = new MutableLiveData<>();
public MainViewModel() {
counter.setValue(0);
}
public LiveData<Integer> getCounter() {
return counter;
}
public void incrementCounter() {
counter.setValue(counter.getValue() + 1);
}
@Override
protected void onCleared() {
super.onCleared();
// 清理资源
}
}
// 在Activity中使用ViewModel
public class MainActivity extends AppCompatActivity {
private MainViewModel viewModel;
private TextView counterText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取ViewModel实例
viewModel = new ViewModelProvider(this).get(MainViewModel.class);
counterText = findViewById(R.id.counter_text);
Button incrementButton = findViewById(R.id.increment_button);
// 观察LiveData变化
viewModel.getCounter().observe(this, new Observer<Integer>() {
@Override
public void onChanged(Integer count) {
counterText.setText(String.valueOf(count));
}
});
incrementButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewModel.incrementCounter();
}
});
}
}
在实际开发中,了解Activity的生命周期状态对于调试和性能优化非常重要。下面我们将实现一个Activity生命周期监控工具。
public abstract class BaseActivity extends AppCompatActivity {
private static final String TAG = "ActivityLifecycle";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, getClass().getSimpleName() + " - onCreate");
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, getClass().getSimpleName() + " - onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, getClass().getSimpleName() + " - onResume");
}
@Override
protected void onPause() {
Log.d(TAG, getClass().getSimpleName() + " - onPause");
super.onPause();
}
@Override
protected void onStop() {
Log.d(TAG, getClass().getSimpleName() + " - onStop");
super.onStop();
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, getClass().getSimpleName() + " - onRestart");
}
@Override
protected void onDestroy() {
Log.d(TAG, getClass().getSimpleName() + " - onDestroy");
super.onDestroy();
}
}
Android Jetpack提供了Lifecycle组件,可以更方便地监控Activity的生命周期:
public class MyLifecycleObserver implements LifecycleObserver {
private static final String TAG = "MyLifecycleObserver";
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
public void onCreate() {
Log.d(TAG, "ON_CREATE");
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onStart() {
Log.d(TAG, "ON_START");
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void onResume() {
Log.d(TAG, "ON_RESUME");
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void onPause() {
Log.d(TAG, "ON_PAUSE");
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onStop() {
Log.d(TAG, "ON_STOP");
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroy() {
Log.d(TAG, "ON_DESTROY");
}
}
// 在Activity中使用
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 添加生命周期观察者
getLifecycle().addObserver(new MyLifecycleObserver());
}
}
可以创建一个无UI的Fragment来监控Activity的生命周期,这在复杂应用中特别有用:
public class LifecycleLoggerFragment extends Fragment {
private static final String TAG = "LifecycleLogger";
private String activityName;
public static LifecycleLoggerFragment newInstance(String activityName) {
LifecycleLoggerFragment fragment = new LifecycleLoggerFragment();
Bundle args = new Bundle();
args.putString("activity_name", activityName);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true); // 在配置变化时保留实例
activityName = getArguments().getString("activity_name");
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
Log.d(TAG, activityName + " - onAttach");
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.d(TAG, activityName + " - onActivityCreated");
}
// 其他生命周期方法...
}
// 在Activity中使用
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 添加生命周期监控Fragment
if (savedInstanceState == null) {
getSupportFragmentManager()
.beginTransaction()
.add(LifecycleLoggerFragment.newInstance(getClass().getSimpleName()), "logger")
.commit();
}
}
}
问题1:描述Activity的完整生命周期
答案:Activity的完整生命周期包括以下阶段:
问题2:为什么要在onPause()中保存数据而不是onStop()?
答案:
问题3:屏幕旋转时Activity的生命周期变化是什么?如何保持数据?
答案:
问题4:onSaveInstanceState()和onRestoreInstanceState()调用时机是什么?
答案:
问题5:如何避免Activity重建时的闪烁问题?
答案:
问题1:如何处理Activity被系统回收后的数据恢复问题?
答案:
问题2:如何解决Activity内存泄漏问题?
答案:
LeakCanary是一个内存泄漏检测库,它通过监控Activity的生命周期来检测潜在的内存泄漏。
// LeakCanary中的ActivityLifecycleCallbacks实现(简化版)
public class ActivityLifecycleMonitor implements Application.ActivityLifecycleCallbacks {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
// 记录Activity创建
}
@Override
public void onActivityDestroyed(Activity activity) {
// 当Activity销毁时,检查是否存在内存泄漏
// 通过弱引用和引用队列检测Activity是否被正确回收
watchForLeak(activity);
}
private void watchForLeak(Activity activity) {
// 创建弱引用并关联引用队列
// 延迟检查Activity是否被回收
// 如果没有被回收,触发堆转储并分析泄漏路径
}
// 其他生命周期回调方法...
}
Glide是一个流行的图片加载库,它会根据Activity/Fragment的生命周期自动管理图片加载任务。
// Glide中的生命周期监听(简化版)
public class RequestManager implements LifecycleListener {
public RequestManager(Lifecycle lifecycle) {
// 注册生命周期监听
lifecycle.addListener(this);
}
@Override
public void onStart() {
// 恢复暂停的请求
resumeRequests();
}
@Override
public void onStop() {
// 暂停请求,释放资源
pauseRequests();
}
@Override
public void onDestroy() {
// 清理资源,取消请求
clearRequests();
}
}
本文详细介绍了Activity的基本概念和生命周期,包括各个生命周期方法的调用时机和适合执行的操作。我们还学习了如何保存和恢复Activity状态,以及使用ViewModel等现代组件简化状态管理。通过实战案例和开源项目分析,我们了解了如何在实际开发中应用这些知识。