前言:最近在从头复习Android相关的知识,所谓温故而知新,每天会整理一些笔记分享出来,希望能帮到有需要的人。
一、Activity是什么?
Activity是Android四大组件(Activity、Service、BroadcastReceiver、ContentProvider)中的核心组件,代表应用中的一个独立界面。每个Activity提供用户交互的窗口,类似于桌面应用的窗体概念。Android应用通常由多个Activity组成,它们通过任务栈(Task Stack)管理,形成用户导航的返回栈。
二、常用场景
- 主界面展示:应用启动时的首个交互界面
- 页面跳转:用户操作触发的界面切换(如列表→详情页)
- 数据采集:表单填写、用户登录等交互场景
- 多窗口适配:分屏模式、自由窗口等响应式设计
三、核心知识点
1. 生命周期(核心)

typescript
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("Lifecycle", "onCreate"); // 初始化界面
}
@Override
protected void onStart() {
super.onStart(); // 界面可见
Log.d("Lifecycle", "onStart");
}
@Override
protected void onResume() {
super.onResume(); // 获取焦点,可交互
Log.d("Lifecycle", "onResume");
}
@Override
protected void onPause() {
super.onPause(); // 失去焦点(如弹出对话框)
Log.d("Lifecycle", "onPause");
}
@Override
protected void onStop() {
super.onStop(); // 完全不可见
Log.d("Lifecycle", "onStop");
}
@Override
protected void onDestroy() {
super.onDestroy(); // 被销毁前资源释放
Log.d("Lifecycle", "onDestroy");
}
}
2. 启动方式
scss
// 显式启动
Intent intent = new Intent(MainActivity.this, DetailActivity.class);
startActivity(intent);
// 隐式启动(需在AndroidManifest中声明intent-filter)
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("https://www.example.com"));
startActivity(intent);
// 带返回值启动
startActivityForResult(intent, REQUEST_CODE);
// 使用Activity Result API 启动
// 注册结果监听器
ActivityResultLauncher<Intent> launcher = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
result -> {
if (result.getResultCode() == RESULT_OK) {
Intent data = result.getData();
// 处理返回数据
}
}
);
// 启动目标Activity
launcher.launch(new Intent(this, DetailActivity.class));
3. 数据传递
scss
// 发送数据
Intent intent = new Intent(this, DetailActivity.class);
intent.putExtra("USER_NAME", "AndroidDev");
intent.putExtra("USER_ID", 1001);
startActivity(intent);
// 接收数据(在DetailActivity中)
String name = getIntent().getStringExtra("USER_NAME");
int id = getIntent().getIntExtra("USER_ID", 0);
// 返回结果
Intent resultIntent = new Intent();
resultIntent.putExtra("RESULT_DATA", "操作成功");
setResult(RESULT_OK, resultIntent);
finish();
4. 启动模式(AndroidManifest配置)
- 一种是在AndroidManifest.xml文件中的activity节点中设置android:launchMode属性
xml
<activity
android:name=".MainActivity"
android:launchMode="singleTop"> <!-- 四种模式 -->
</activity>
standard:默认模式,每次启动创建新实例
singleTop:栈顶复用(防止重复打开)
singleTask:栈内复用(适合主界面)
singleInstance:独立栈(系统级应用)
- 一种就是通过在开启Activity的时候,通过设置Intent Flag来设置
ini
Intent intent=new Intent(this,MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
1. FLAG_ACTIVITY_SINGLE_TOP(同singleTop)
2. FLAG_ACTIVITY_CLEAR_TOP(同singleTask)
3. FLAG_ACTIVITY_NO_HISTORY
- 新活动不会保留在历史栈中,一旦用户切换到其他页面,新活动会马上销毁。
- 旧活动的onActivityResult()方法永远不会被触发。
4. FLAG_ACTIVITY_NEW_TASK(同singleInstance)
四、整理的一部分面试题
1:onSaveInstanceState() 何时调用?与onPause()的区别?
答:
-
调用时机:Activity被异常销毁前(如屏幕旋转、内存不足)
-
区别:
onPause()
:任何失去焦点时都调用onSaveInstanceState()
:只在非用户主动关闭时触发
-
典型用途:保存临时数据(EditText内容等)
2:Activity A启动B时生命周期变化?
A.onPause() → B.onCreate() → B.onStart() → B.onResume() → A.onStop()
注意:旧Activity的onPause()执行完成后,新Activity才会创建
3:如何避免Activity内存泄漏?
- 避免非静态内部类(改用静态内部类+WeakReference)
- 及时注销监听器(onDestroy中解除广播、Handler等)
- 谨慎使用Context(ApplicationContext优先)
- 避免在Activity中保存大数据
4:singleTask和singleInstance的区别?
特性 | singleTask | singleInstance |
---|---|---|
任务栈 | 可与其它Activity同栈 | 独占新栈 |
多应用共享 | 不支持 | 支持(如系统相机调用) |
常见场景 | 应用主界面 | 系统级功能(分享菜单) |