Activity And Binder
Table of Contents

++
ActivityManagerProxy相当于Proxy (client side), ActivityManagerNative相当于Stub(server side). ActivityManagerService相当于继承了Stub的MyBinder。

所以一般bindService的调用方式是:getDefault()获取ActivityManagerProxy对象,然后调用ActivityManagerProxy的 service apis,然后调用mRemote.transact—->
,调到ActivityManagerNative的transact(..),它里面调用到onTransact(…) ,onTransact 再调用 ActivityManagerService的 service api implementation。

201171011483515.gif.png

ActivityManager 为应用程序访问的lib. 提供了一个函数: public List<RunningServiceInfo> getRunningServices(int maxNum)

public List<RunningServiceInfo> getRunningServices(int maxNum) throws SecurityException {
try {
return (List<RunningServiceInfo>)ActivityManagerNative.getDefault()
.getServices(maxNum, 0);
} catch (RemoteException e) {
// System dead, we will be dead too soon!
return null;
}
}

+++

0_1290738421pP1k.gif

在这张图中,绿色的部分是在SDK中开放给应用程序开发人员的接口,蓝色的部分是一个典型的Proxy模式,红色的部分是底层的服务实现,是真正的动作执行者。

上面的类结构图,其中ActivityManager是一个客户端,为了隔离它与ActivityManagerService,有效降低甚至消除二者的耦合度,在这中间使用了ActivityManagerProxy代理类,所有对ActivityManagerService的访问都转换成对代理类的访问.

在上面的类结构图里也有落实,ActivityManagerProxy and ActivityManagerNative 分别本地和远端服务, 都实现了IActivityManager 接口

ActivityManagerService extends ActivityManagerNative。

0_12907384337Ff2.gif

我们以ActivityManager的getRunningServices()函数为例,对上述序列图进行解析。

public List<RunningServiceInfo> getRunningServices(int maxNum) throws SecurityException {
try {
return (List<RunningServiceInfo>)ActivityManagerNative.getDefault()
.getServices(maxNum, 0);
} catch (RemoteException e) {
return null;
}
}

可以看到,调用被委托到了ActivatyManagerNative.getDefault()。

static public IActivityManager asInterface(IBinder obj) {
……
return new ActivityManagerProxy(obj);
}

static public IActivityManager getDefault() {
……
IBinder b = ServiceManager.getService("activity");
gDefault = asInterface(b);
return gDefault;
}

从上述简化后的源码可以看到,getDefault()函数返回的是一个ActivityManagerProxy对象的引用,也就是说,ActivityManager得到了一个本地代理。

因为在IActivityManager接口中已经定义了getServices()函数,所以我们来看这个本地代理对该函数的实现。

public List getServices(int maxNum, int flags) throws RemoteException {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
……
mRemote.transact(GET_SERVICES_TRANSACTION, data, reply, 0);
……
}

从这个代码版段我们看到,调用Proxy的transact()函数,而这个mRemote就是ActivityManagerNative的Binder接口, 也就是getDefault中的IBinder b。

接下来我们看一下远端ActivityManagerNative的代码,因为该类是继承于Binder类的,因此有transact() 实现。onTransact()函数的实现。
public final boolean transact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {
……
boolean r = onTransact(code, data, reply, flags);
if (reply != null) {
reply.setDataPosition(0);
}
return r;
}

public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
throws RemoteException {
switch (code) {
case GET_SERVICES_TRANSACTION: {
……
List list = getServices(maxNum, fl);
……
return true;
}
……
}
return super.onTransact(code, data, reply, flags);
}

在onTrasact()函数内,虽然代码特别多,但就是一个switch语句,根据不同的code命令进行不同的处理,比如对于GET_SERVICES_TRANSACTION命令,只是调用了getServices()函数。而该函数的实现是在ActivityManagerService类中,它是ActivityManagerNative的子类.

http://blog.csdn.net/caowenbin/article/details/6036726

ActivityStack

http://developer.android.com/guide/components/tasks-and-back-stack.html

a11e8a03-285a-3012-9e58-151a321473b5.png
75941386819088.png

http://www.cnblogs.com/itiscoder/p/3612546.html
http://my.oschina.net/u/1020095/blog/118294

window

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License