Activity Manager Service
本章节将详细介绍Android中的Activity Manager Service(AMS)机制,包括其工作原理、生命周期管理和进程管理等核心功能。
核心问题
- AMS的主要职责是什么?
- Activity的启动流程是怎样的?
- AMS是如何管理应用进程的?
AMS基础
主要功能
-
组件管理
- Activity的启动、切换和调度
- Service的启动和绑定
- Broadcast的分发
- ContentProvider的发布
-
进程管理
- 进程的创建和死亡管理
- 进程优先级调度
- 进程状态监控
源码分析
Activity启动流程
// Activity.startActivity的核心流程
public void startActivity(Intent intent) {
startActivity(intent, null);
}
public void startActivity(Intent intent, Bundle options) {
if (options != null) {
startActivityForResult(intent, -1, options);
} else {
startActivityForResult(intent, -1);
}
}进程创建流程
private final boolean attachApplicationLocked(IApplicationThread thread,
int pid, int callingUid, long startSeq) {
// 查找进程记录
ProcessRecord app = mPidsSelfLocked.get(pid);
// 绑定应用进程
thread.bindApplication(processName, appInfo, providers,
app.instrumentationClass,
profilerInfo, app.instrumentationArguments,
app.instrumentationWatcher, app.instrumentationUiAutomationConnection,
testMode, enableOpenGlTrace, isRestrictedBackupMode, enableTrackAllocation,
isAutoFillCompatibilityEnabled, app.mBoundClientUid, null,
new Configuration());
}实践应用
Activity启动模式的使用
// AndroidManifest.xml配置
<activity
android:name=".MainActivity"
android:launchMode="singleTask"
android:taskAffinity="com.example.task"/>
// 代码中启动
Intent intent = new Intent(this, SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);面试题解析
Q1:ActivityThread是什么?和AMS的关系是什么?
- ActivityThread是应用程序的主线程
- 负责执行主线程的消息循环
- 通过Binder与AMS通信
Q2:Activity的Task和TaskRecord是什么?
- Task是Activity的栈,用于管理Activity
- TaskRecord是系统中对应Task的数据结构
- 通过taskAffinity属性可以指定Activity所属的Task
Q3:进程优先级是如何划分的?
- 前台进程(Foreground Process)
- 可见进程(Visible Process)
- 服务进程(Service Process)
- 后台进程(Background Process)
- 空进程(Empty Process)
最佳实践
- 合理使用Activity启动模式
- 注意Activity的内存泄漏
- 避免滥用Service
- 合理处理进程优先级
- 正确使用Intent标志位