Activtiy完全解析(一、Activity的创建
过程)
在Android开发过程中,我们几乎每天都在跟Activity打交道。我们循规蹈矩的调用startActivity()方法便可以打开一个新的界面,但是这个
界面是怎样从无到有我们却不是很清楚,也有很多人根本就没有想过。我们写的layout布局通过setContentView()方法是怎样加载到activity
中,然后又是怎样显示到界面上的?这一系列的问题相信大多数人都不清楚。
也许是因为我们平时的开发过程根本不需要了解这些,但是如果深入了解后,对我们还是很有帮助的。接下来我们用3篇文章去分析一下
Activity从无到显示布局这一过程,第一篇我们就深入研究一下Activity的创建过程。
step 1. Activity.startActivtiy()
在Android系统中,我们比较熟悉的打开Activity通常有两种方式,第一种是点击应用程序图标,Launcher会启动应用程序的主Activity,我们
知道Launcher其实也是一个应用程序,他是怎样打开我们的主Activity的呢?在应用程序被安装的时候,系统会找到AndroidManifest.xml中
activity的配置信息,并将action=android.intent.action.MAIN&category=android.intent.category.LAUNCHER的activity记录下来,形成应
用程序与主Activity 的映射关系,当点击启动图标时,Launcher就会找到应用程序对应的主activity并将它启动。第二种是当主Activity启动
之后,在应用程序内部可以调用startActivity()开启新的Activity,这种方式又可分为显示启动和隐式启动。不管使用哪种方式启动Activity
,其实最终调用的都是startActivity()方法。所以如果要分析Activity的启动过程,我们就从startActivity()方法分析。跟踪发现Activity
中重载的startActivity()方法最终都是调用startActivityForResult(intent, requestCode , bundle):
public void startActivityForResult(Intent intent, int requestCode, Bundle options) {
//一般Activity的mParent都为null,mParent常用在ActivityGroup中,ActivityGroup已废弃
if (mParent == null) {
//启动新的Activity
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, this, intent, requestCode, options); if (ar != null) {
//跟踪execStartActivity(),发现开启activity失败ar才可能为null,这时会调用onActivityResult
mMainThread.sendActivityResult(
mToken, mEmbeddedID, requestCode, ar.getResultCode(), ar.getResultData()); } ... } else {
//在ActivityGroup内部的Activity调用startActivity的时候会走到这里,处理逻辑和上面是类似的
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); } } }
从上面的代码可以发现,开启activity的关键代码是mInstrumentation.execStartActivity(),mInstrumentation是Activity的成员变量,用
于监视系统与应用的互交。
step2. Instrumentation.execStartActivity()
public ActivityResult execStartActivity(
Context who, IBinder contextThread, IBinder token, String target, Intent intent, int requestCode, Bundle options) {
IApplicationThread whoThread = (IApplicationThread) contextThread; //mActivityMonitors是所有ActivityMonitor的集合,用于监视应用的Activity(记录状态) if (mActivityMonitors != null) { synchronized (mSync) {
//先查找一遍看是否存在这个activity final int N = mActivityMonitors.size(); for (int i=0; i final ActivityMonitor am = mActivityMonitors.get(i); if (am.match(who, null, intent)) { //如果找到了就跳出循环 am.mHits++; //如果目标activity无法打开,直接return if (am.isBlocking()) { return requestCode >= 0 ? am.getResult() : null; } break; } } } } try { intent.migrateExtraStreamToClipData(); intent.prepareToLeaveProcess(); //这里才是真正开启activity的地方,ActivityManagerNative中实际上调用的是ActivityManagerProxy的方法 int result = ActivityManagerNative.getDefault() .startActivity(whoThread, who.getBasePackageName(), intent, intent.resolveTypeIfNeeded(who.getContentResolver()), token, target, requestCode, 0, null, options); //checkStartActivityResult方法是抛异常专业户,它对上面开启activity的结果进行检查,如果无法打开activity, //则抛出诸如ActivityNotFoundException类似的各种异常 checkStartActivityResult(result, intent); } catch (RemoteException e) { throw new RuntimeException(\ } return null; } mInstrumentation的execStartActivity()方法中首先检查activity是否能打开,如果不能打开直接返回,否则继续调用 ActivityManagerNative.getDefault().startActivity()开启activity,然后检查开启结果,如果开启失败,会抛出异常(比如未在 AndroidManifest.xml注册)。接着我们转入ActivityManagerNative中: step3. ActivityManagerNative 在讲解此步骤之前,先大致介绍一下ActivityManagerNative这个抽象类。ActivityManagerNative继承自Binder(实现了IBinder),实现了 IActivityManager接口,但是没有实现他的抽象方法。 ActivityManagerNative中有一个内部类ActivityManagerProxy,ActivityManagerProxy也实 现了IActivityManager接口,并实现了 IActivityManager中所有的方法。IActivityManager里面有很多像startActivity()、startService()、bindService()、registerReveicer() 等方法,它为Activity管理器提供了统一的API。 ActivityManagerNative通过getDefault()获取到一个ActivityManagerProxy的示例,并将远程代理对象IBinder传递给他,然后调用他的 starXxx方法开启Service、Activity或者registReceiver,可以看出ActivityManagerNative只是一个装饰类,真正工作的是其内部类 ActivityManagerProxy。 ①.ActivtiyManagerNative.getDefault().startActivity() static public IActivityManager getDefault() { //此处返回的IActivityManager示例是ActivityManagerProxy的对象 return gDefault.get(); } private static final Singleton protected IActivityManager create() { //android.os.ServiceManager中维护了HashMap //通过名称获取到ActivityManagerService对应的IBinder远程代理对象 IBinder b = ServiceManager.getService(\ if (false) { Log.v(\ } //返回一个IActivityManager对象,这个对象实际上是ActivityManagerProxy的对象 IActivityManager am = asInterface(b); if (false) { Log.v(\ } return am; } }; static public IActivityManager asInterface(IBinder obj) { if (obj == null) { return null; } IActivityManager in = (IActivityManager)obj.queryLocalInterface(descriptor); if (in != null) { return in; } //返回ActivityManagerProxy对象 return new ActivityManagerProxy(obj); } ActivityManagerNative中的方法只是获取到ActivityManagerProxy的实例,然后调用其startActivity方法: ②.ActivtiyManagerProxy.startActivity() public int startActivity(IApplicationThread caller, String callingPackage, Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle options) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); //下面的代码将参数持久化,便于ActivityManagerService中获取 data.writeInterfaceToken(IActivityManager.descriptor); data.writeStrongBinder(caller != null ? caller.asBinder() : null); data.writeString(callingPackage); intent.writeToParcel(data, 0); data.writeString(resolvedType); data.writeStrongBinder(resultTo); data.writeString(resultWho); data.writeInt(requestCode); data.writeInt(startFlags); if (profilerInfo != null) { data.writeInt(1); profilerInfo.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE); } else { data.writeInt(0); } if (options != null) { data.writeInt(1); options.writeToParcel(data, 0); } else { data.writeInt(0); } //mRemote就是ActivityManagerService的远程代理对象,这句代码之后就进入到ActivityManagerService中了 mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0); 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库Activtiy完全解析(一、Activity的创建过程)在线全文阅读。
相关推荐: