Android Framework学习笔记(五)应用程序启动过程,kotlin匿名内部类写法

本文详细解析了Android应用程序从启动到显示的过程,涉及ActivityManagerNative、ActivityManagerService、Binder机制、ActivityStackSupervisor等多个组件的交互,深入探讨了启动流程中的关键步骤和方法调用链,帮助开发者理解Android系统的内部运作。
摘要由CSDN通过智能技术生成

checkStartActivityResult(result, intent);

} catch (RemoteException e) {

throw new RuntimeException(“Failure from system”, e);

}

return null;

}

注释1首先调用ActivityManagerNative的getDefault来获取ActivityManageService(以后简称为AMS)的代理对象,接着调用它的startActivity方法。

这里ActivityManagerNative.getDefault()涉及到Binder进程间通信机制,下面进行一个简短的介绍,这不是本文的重点。了解过的同学可以略过下面这段Binder简析,不想了解的也可以直接理解为返回的是AMS。实际调用的是AMS#startActivity()。

AMS中Binder机制简析

frameworks/base/core/java/android/app/ActivityManagerNative.java

ActivityManagerNative.getDefault()

static public IActivityManager getDefault() {

return gDefault.get();

}

private static final Singleton gDefault = new Singleton() {

protected IActivityManager create() {

IBinder b = ServiceManager.getService(“activity”); //1

IActivityManager am = asInterface(b); //2

return am;

}

};

static public IActivityManager asInterface(IBinder obj) {

if (obj == null) {

return null;

}

IActivityManager in =

(IActivityManager)obj.queryLocalInterface(descriptor);

if (in != null) {

return in;

}

return new ActivityManagerProxy(obj);

}

getDefault方法调用了gDefault的get方法,gDefault 是一个Singleton类。注释1处得到名为”activity”的Service代理对象,也就是AMS的代理对象。

注释2处将它封装成ActivityManagerProxy(以后简称为AMP)类型对象,并将它保存到gDefault中,此后调用ActivityManagerNative(以后简称为AMN)的getDefault方法就会直接获得AMS的代理AMP对象。

回到Instrumentation类的execStartActivity方法中,从上面得知就是调用AMP的startActivity,其中AMP是AMN的内部类,代码如下所示。

frameworks/base/core/java/android/app/ActivityManagerNative.java

ActivityManagerProxy#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();

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.transact(START_ACTIVITY_TRANSACTION, data, reply, 0); //1

reply.readException();

int result = reply.readInt();

reply.recycle();

data.recycle();

return result;

}

首先会将传入的参数写入到Parcel类型的data中。在注释1处通过IBinder对象mRemote向AMN发送一个START_ACTIVITY_TRANSACTION类型的进程间通信请求。那么服务端AMN就会从Binder线程池中读取我们客户端发来的数据,最终会调用AMN的onTransact方法中执行。

ActivityManagerNative#onTransact()

@Override

public boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {

switch (code) {

case START_ACTIVITY_TRANSACTION:

{

int result = startActivity(app, callingPackage, intent, resolvedType, resultTo, resultWho, requestCode, startFlags, profilerInfo, options); //1

reply.writeNoException();

reply.writeInt(result);

return true;

}

}

因为AMS继承了AMN,服务端真正的实现是在AMS中,注释1最终会调用AMS的startActivity方法。

ActivityManagerService#startActivity()

@Override

public final int startActivity(IApplicationThread caller, String callingPackage, Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profiler

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值