ActivityManagerService服务框架:

ActivityManagerService在android中主要的作用有二部分:

(1)activity栈管理

(2)消息分发

activity栈管理:

activity 的生命周期:

android ActivityManagerService服务详解_第1张图片

在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关系图如下:

android ActivityManagerService服务详解_第2张图片

(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相关知识

待续。。。。。。


更多相关文章

  1. C语言函数以及函数的使用
  2. Activity详解——Activity的xml配置
  3. Android Content Provider详解及示例代码
  4. Android的IPC机制Binder的详解(转发)
  5. android 自定义attr 详解
  6. 通过XML设置屏幕方向(android:screenOrientation)详解
  7. android 导出签名APK--混淆文件proguard.cfg详解

随机推荐

  1. Android(安卓)Studio报错org.junit不存在
  2. 关于相对布局RelativeLayout的各种属性
  3. Android仿微信实现下拉列表
  4. Android Activity onNewIntent() 详解
  5. Android NDK编程浅入深出之--了解NDK
  6. Android实现九宫格
  7. android 集成腾讯bugly版本升级功能
  8. android 定时器的实现
  9. Android:EditText屏蔽输入法弹窗
  10. 学习心得(二)