Activtiy完全解析(一、Activity的创建过程)

2019-02-16 00:03

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 gDefault = new Singleton() {

protected IActivityManager create() {

//android.os.ServiceManager中维护了HashMap sCache,他是系统Service对应的IBinder代理对象的集合

//通过名称获取到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);


Activtiy完全解析(一、Activity的创建过程).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:中国百事可乐行业市场调查研究报告(目录)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: