Android的四大组件中除了BroadcastReceiver以外,其他三种组件都必须在AndroidManifest中注册,对于BroadcastReceiver来说,他即可在AndroidManifest中注册也可以通过代码来注册。在调用方式上,Activity、Service和BroadcastReceiver需要借助Intent,而ContentProvider则无需借助Intent。
public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) {
if (mParent == null) {
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, this,
intent, requestCode, options);
if (ar != null) {
mMainThread.sendActivityResult(
mToken, mEmbeddedID, requestCode, ar.getResultCode(),
ar.getResultData());
}
if (requestCode >= 0) {
// If this start is requesting a result, we can avoid making
// the activity visible until the result is received. Setting
// this code during onCreate(Bundle savedInstanceState) or onResume() will keep the
// activity hidden during this time, to avoid flickering.
// This can only be done when a result is requested because
// that guarantees we will get information back when the
// activity is finished, no matter what happens to it.
mStartedActivity = true;
}
cancelInputsAndStartExitTransition(options);
// TODO Consider clearing/flushing other event sources and events for child windows.
} else {
if (options != null) {
mParent.startActivityFromChild(this, intent, requestCode, options);
} else {
// Note we want to go through this method for compatibility with
// existing applications that may have overridden it.
mParent.startActivityFromChild(this, intent, requestCode);
}
}
}
mParent代表的是ActivityGrop,ActivityGroup最开始被用来在一个界面中嵌入多个Activity,在API13中被废弃,推荐使用Fragment。
mMainThread.getApplicationThread()得到的是一个Applicatin对象,是ActivityThread的一个内部类 。
ActivityManagerNative.getDefault()
可以 看到,得到一个Binder对象。
ActivityManagerService继承自ActivityManagerNative,所以AMS也是一个Binder。
ActivityManagerNative.getDefault 实际上得到的是AMS,
我们在回过头来看Instrumentation#execStartActivity中的checkStartActivityResult(..)方法。也就是Instrumentation#checkStartActivityResult方法。方法见下图。
,恩 很明白,就是检查下启动结果,如果错误的话抛出一些对应的异常。
调用startActivityAsUser(),这个函数代码如下。
其中mStackSupervisor是ActivityStackSupervisor对象。(从字面上看是activity栈的管理员)
startActivityLocked方法太长了,就不贴了,他里面会调用startActivityUncheckedLocked方法。这个方法还是那么 长,在这个方法中会调用ActivityStack#resumeTopActivitiesLocked
result = resumeTopActivityInnerLocked(prev, options)
这个方法长,我就贴下关键那一句了。
看看,又回到ActivityStackSupervisor了。
realStartActivityLocked(r, app, andResume, checkConfig);
听名字好像是要真的startActivity了。
这里的app.Thread就是IApplicationThread,这是个接口,他的实现类是ActivityThread的内部类ApplicationThread,如图
饶了这么长的一圈,还是回到ActivityThread中了。
看到Activity a = per….,终于到了。
ActivityThread#performLaunchActivity
那么。这个方法中干了什么呢。
Application app = r.packageInfo.makeApplication(false, mInstrumentation);
我去,到这里就完了,整个过程真是极其复杂,让我静下来在看看。哎,这里给出一篇博客来供大家学习。凯子哥
Service的启动过程
@Override
public ComponentName startService(Intent service) {
return mBase.startService(service);
}
这里的这个mBase是Context类型,而Context是个抽象类,他的实现类是ContextImpl,so,我们去看ContextImpl#startService(service)
@Override
public ComponentName startService(Intent service) {
warnIfCallingFromSystemProcess();
return startServiceCommon(service, mUser);
}
这里调用了startServiceCommon方法。
private ComponentName startServiceCommon(Intent service, UserHandle user) {
try {
validateServiceIntent(service);
service.prepareToLeaveProcess();
ComponentName cn = ActivityManagerNative.getDefault().startService(
mMainThread.getApplicationThread(), service, service.resolveTypeIfNeeded(
getContentResolver()), getOpPackageName(), user.getIdentifier());
if (cn != null) {
if (cn.getPackageName().equals("!")) {
throw new SecurityException(
"Not allowed to start service " + service
+ " without permission " + cn.getClassName());
} else if (cn.getPackageName().equals("!!")) {
throw new SecurityException(
"Unable to start service " + service
+ ": " + cn.getClassName());
}
}
return cn;
} catch (RemoteException e) {
throw new RuntimeException("Failure from system", e);
}
}
哎,有点熟悉,上面有说到过。ActivityManagerNative.getDefault()就是AMS,所以我们转去ActivityManagerService#startService(五个参数)
public final void scheduleCreateService(IBinder token,
ServiceInfo info, CompatibilityInfo compatInfo, int processState) {
updateProcessState(processState, false);
CreateServiceData s = new CreateServiceData();
s.token = token;
s.info = info;
s.compatInfo = compatInfo;
sendMessage(H.CREATE_SERVICE, s);
}
,这里发送消息,最后会调用handleCreateService。
。
Service的绑定过程
依然从ContextWrapper开始,最后会跳转到ContextImpl#bindServiceCommon方法
sd = mPackageInfo.getServiceDispatcher(conn, getOuterContext(),
mMainThread.getHandler(), flags);
完成,接着会调用AMS的bindService方法。
Service有一个特点,当多次绑定的时候onBind方法只会执行一次,除非Service被终止。
还有一个我没记录,懒..
注册过程
静态注册的广播由PMS来完成,我们看动态注册。
ActivityManagerService#registerReceiver
方法很长,关键就是把远程的InnerReceiver对象以及IntentFilter对象存储下来。这样就完成了注册过程。
发送广播
queue.scheduleBroadcastsLocked();
ContentProvider的onCreate方法要先于Application的onCreate方法执行。增删该茶的源码不想说了。太累了,只说下AMS中ContentProvider的创建过程把。
总结:发现这4大组件的源码有很多相似之处。分析起来吃力,但是当理解了Activity的原理之后,去理解其他就会好很多。当然,这是在跟着大神走的前提下。
好了,现在我对这些也有点了解了,闪人。