android ActivityManagerService服务详解
ActivityManagerService服务框架:
ActivityManagerService在android中主要的作用有二部分:
(1)activity栈管理
(2)消息分发
activity栈管理:
activity 的生命周期:
在android中启动Activity的方式如下:
startActivity()
Activity.java(frameworks\base\core\java\android\app)
(1)@Override
publicvoid startActivity(Intent intent) {
startActivityForResult(intent, -1);
}
(2)public void startActivityForResult(Intent intent, intrequestCode) {
if (mParent == null) {
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, this,
intent, requestCode);
。。。。。。
}
(3)上面的代码中有如下一段:
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, this,
intent, requestCode);
(4)public ActivityResult execStartActivity(
。。。。。。
try {
//调用AtivityMangerServices startActivity
int result = ActivityManagerNative.getDefault()
.startActivity(whoThread, intent,
intent.resolveTypeIfNeeded(who.getContentResolver()),
null, 0, token, target != null ? target.mEmbeddedID : null,
requestCode, false, false);
checkStartActivityResult(result, intent);
} catch (RemoteException e) {
}
return null;
}
从上面(1)--(4)的代码流程我们可以知道当在activity中调用startActivity函数是最终回通过AIDL调用到ActivityManagerServicestartActivity所以ActivityManagerService和activity有如下的关系:
(1)在ActivityManagerService中,有一个用来管理activity的地方:mHistory栈,这个mHistory栈里存放的是服务端的activity记录HistoryActivity。处于栈顶的就是当前处于运行状态的activity。
final ArrayList mHistory = new ArrayList();
(2)当应用程序启动的时候会启动一个线程ActivityThread。注意每个应用程序都有一个ActivityThread与之对应
public static final void main(String[] args) {
SamplingProfilerIntegration.start();
Process.setArgV0("<pre-initialized>");
Looper.prepareMainLooper();
ActivityThread thread = new ActivityThread();
thread.attach(false);
。。。。。。
}
private final void attach(boolean system) {
。。。。。。
IActivityManager mgr = ActivityManagerNative.getDefault();
try {
mgr.attachApplication(mAppThread);//调用ActivityManagerService的attachApplication将线程信息加入到ActivityManagerService端的ProcessRecord
}
。。。。。。
}
(3)ActivityThread端的activity信息全部被存储在ActivityThread的成员变量mActivities中,在mActivities中,记录了应用程序创建的所有activity实例记录,对应的是ActivityRecord。
finalHashMap<IBinder,ActivityRecord>mActivities=newHashMap<IBinder,ActivityRecord>();
ActivityThread与ActivityManagerService关系图如下:
(1)scheduleLaunchActivity方法:
public finalvoid scheduleLaunchActivity(Intent intent, IBinder token, intident,
ActivityInfo info, Bundle state,List<ResultInfo> pendingResults,
List<Intent> pendingNewIntents,boolean notResumed, boolean isForward) {
ActivityRecord r = new ActivityRecord();
r.token = token;
r.ident = ident;
r.intent = intent;
r.activityInfo = info;
r.state = state;
r.pendingResults = pendingResults;
r.pendingIntents = pendingNewIntents;
r.startsNotResumed = notResumed;
r.isForward = isForward;
queueOrSendMessage(H.LAUNCH_ACTIVITY, r);//发送消息给ActivityThread.handleMessage()中处理
}
public void handleMessage(Message msg) {
switch (msg.what) {
case LAUNCH_ACTIVITY: {
ActivityRecord r = (ActivityRecord)msg.obj;
r.packageInfo = getPackageInfoNoCheck(
r.activityInfo.applicationInfo);
handleLaunchActivity(r, null);
} break;
。。。。。。
}
scheduleLaunchActivity调用时会使用消息队列的方式调用到handleMessage函数,同时handleMessage会调用handleLaunchActivity,此函数的作用主要是将activity信息加入到mActivity中同时启动activity,启动activity时涉及到window、view、windowManager相关知识
待续。。。。。。
更多相关文章
- C语言函数以及函数的使用
- Activity详解——Activity的xml配置
- Android Content Provider详解及示例代码
- Android的IPC机制Binder的详解(转发)
- android 自定义attr 详解
- 通过XML设置屏幕方向(android:screenOrientation)详解
- android 导出签名APK--混淆文件proguard.cfg详解