Android源碼里有不少關于代理模式的實現,比如源碼的[ActivityManagerProxy](https://www.androidos.net.cn/android/5.0.1_r1/xref/frameworks/base/core/java/android/app/ActivityManagerNative.java) 代理類, 其具體代理的是[ActivityManagerNative](https://www.androidos.net.cn/android/5.0.1_r1/xref/frameworks/base/core/java/android/app/ActivityManagerNative.java) 的子類[ActivityManagerService](https://www.androidos.net.cn/android/5.0.1_r1/xref/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java)。
[ActivityManager](https://www.androidos.net.cn/android/5.0.1_r1/xref/frameworks/base/core/java/android/app/ActivityManager.java)是Android中管理和維護Activity的相關信息的類,為了隔離它與ActivityManagerService,有效降低二者的耦合,在這中間使用了ActivityManagerProxy代理類,所有對ActivityManagerService的訪問都轉換成對代理類的訪問,這樣ActivityManager就與ActivityManagerService解耦了。


**ActivityManagerNative.java**
~~~
public abstract class ActivityManagerNative extends Binder implements IActivityManager{
................................
}
~~~
**IActivityManager.java**
~~~
public interface IActivityManager extends IInterface {
....................
}
~~~
**ActivityManagerService.java**
~~~
public final class ActivityManagerService extends ActivityManagerNative
implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {
.....................
}
~~~
**ActivityManager.java**
~~~
public class ActivityManager {
.................
}
~~~
下面我們以API 21(Android 5.0.0_r7)來學習Android源碼中的代理模式
ActivityManagerProxy 這個類, 該類與ActivityManagerNative 這個類處于同一文件中。
~~~
class ActivityManagerProxy implements IActivityManager{
..................
}
~~~
ActivityManagerProxy 實現了IActivityManager 接口,該接口定義了一些Activity 相關的接口方法, 其中有一些我們在應用開發中也時常接觸到。
**IActivityManager.java**
~~~
package android.app;
/**
* System private API for talking with the activity manager service. This
* provides calls from the application back to the activity manager.
*
* {@hide}
*/
public interface IActivityManager extends IInterface {
public int startActivity(IApplicationThread caller, String callingPackage, Intent intent,
String resolvedType, IBinder resultTo, String resultWho, int requestCode, int flags,
ProfilerInfo profilerInfo, Bundle options) throws RemoteException;
...............
public Intent registerReceiver(IApplicationThread caller, String callerPackage,
IIntentReceiver receiver, IntentFilter filter,
String requiredPermission, int userId) throws RemoteException;
public void unregisterReceiver(IIntentReceiver receiver) throws RemoteException;
..............
public ComponentName startService(IApplicationThread caller, Intent service,
String resolvedType, int userId) throws RemoteException;
public int stopService(IApplicationThread caller, Intent service,
String resolvedType, int userId) throws RemoteException;
.............
public int bindService(IApplicationThread caller, IBinder token,
Intent service, String resolvedType,
IServiceConnection connection, int flags, int userId) throws RemoteException;
................
public int checkPermission(String permission, int pid, int uid)
throws RemoteException;
...............
public void overridePendingTransition(IBinder token, String packageName,
int enterAnim, int exitAnim) throws RemoteException;
...............
}
~~~
IActivityManager 這個接口類就相當于代理模式中的抽象主題,那么真正的實現主題是誰呢?就是上面我們所提到過的繼承于ActivityManagerNative 的ActivityManagerService 類,這幾個類之間的大致關系如圖所示。
:-: 
IActivityManager的結構關系
通過UML類圖可以清晰地看到ActivityManagerProxy和ActivityManagerNative都實現了接口IActivityManager,嚴格來說, **ActivityManagerProxy 就是代理部分**,而ActivityManagerNative 就是真實部分,但**ActivityManagerNative 是個抽象類,其并不處理過多的具體邏輯, 大部分具體邏輯的實現都由其子類ActivityManagerService 承擔**,這就是為什么我們說真實部分應該為ActivityManagerService 而非ActivityManagerNative。**ActivityManagerService 是系統級的Service 并且運行于獨立的進程空間中,可以通過ServiceManger 來獲取它。而ActivityManagerProxy 也運行于自己所處的進程空間中,兩者并不相同,因此ActivityManager Proxy 與ActivityManagerService 的通信必定是通過跨進程來進行的,而由上述的類圖我們也可以了解到,這里跨進程的實現是基于Android 的Binder機制**,同時通過上面我們對代理模式的4 種適用情景可以判斷,**此處源碼所實現的代理實質為遠程代理**。**ActivityManagerProxy 在實際的邏輯處理中并未過多地被外部類使用,因為在Android 中管理與維護Activity 相關信息的類是另外一個叫做ActivityManager 的類**, **ActivityManager 雖說管理著Activity 的信息,但是實質上其大多數邏輯都由ActivityManagerProxy 承擔**,這里以其中的getAppTasks 方法為例,在ActivityManager 中getAppTasks 方法的邏輯如下。
**ActivityManager:getAppTasks()**
~~~
public List<ActivityManager.AppTask> getAppTasks() {
ArrayList<AppTask> tasks = new ArrayList<AppTask>();
List<IAppTask> appTasks;
try {
appTasks = ActivityManagerNative.getDefault().getAppTasks(mContext.getPackageName());
} catch (RemoteException e) {
// System dead, we will be dead too soon!
return null;
}
int numAppTasks = appTasks.size();
for (int i = 0; i < numAppTasks; i++) {
tasks.add(new AppTask(appTasks.get(i)));
}
return tasks;
}
~~~
主要只是簡單地調用了ActivityManagerNative的getDefault 方法獲取一個IActivityManager 類型的對象,然后通過該對象再調用其getAppTasks方法,注意,這里結合代理模式理解。而ActivityManagerNative的getDefault 方法只是單純地返回了。
**ActivityManagerNative:getDefault()**
~~~
static public IActivityManager getDefault() {
return gDefault.get();
}
~~~
這個gDefault 又是做什么的呢?具體如下代碼所示。
**ActivityManagerNative.getDefault**
~~~
private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {
protected IActivityManager create() {
IBinder b = ServiceManager.getService("activity");
if (false) {
Log.v("ActivityManager", "default service binder = " + b);
}
IActivityManager am = asInterface(b);
if (false) {
Log.v("ActivityManager", "default service = " + am);
}
return am;
}
};
~~~
上述代碼只是構造了一個Singleton<IActivityManager>類型的gDefault 對象,其中通過`ServiceManager.getService("activity")`獲取了一個系統級的Service,而**這個Service 實質上就是ActivityManagerService** ,這里也就完成創建了一個對ActivityManagerService 的Client 代理對象ActivityManagerProxy 的實例。ActivityManagerProxy 中的getAppTasks 方法邏輯就很明確,將數據打包跨進程傳遞給Server 端ActivityManagerService 處理并返回結果。
**ActivityManagerProxy:getAppTasks**
~~~
public List<IAppTask> getAppTasks(String callingPackage) throws RemoteException {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor);
data.writeString(callingPackage);
mRemote.transact(GET_APP_TASKS_TRANSACTION, data, reply, 0);
reply.readException();
ArrayList<IAppTask> list = null;
int N = reply.readInt();
if (N >= 0) {
list = new ArrayList<IAppTask>();
while (N > 0) {
IAppTask task = IAppTask.Stub.asInterface(reply.readStrongBinder());
list.add(task);
N--;
}
}
data.recycle();
reply.recycle();
return list;
}
~~~
再來看看ActivityManagerService 中對getAppTasks 方法的邏輯處理
**ActivityManagerService:getAppTasks**
~~~
@Override
public List<IAppTask> getAppTasks(String callingPackage) {
int callingUid = Binder.getCallingUid();
long ident = Binder.clearCallingIdentity();
synchronized(this) {
ArrayList<IAppTask> list = new ArrayList<IAppTask>();
try {
if (localLOGV) Slog.v(TAG, "getAppTasks");
final int N = mRecentTasks.size();
for (int i = 0; i < N; i++) {
TaskRecord tr = mRecentTasks.get(i);
// Skip tasks that do not match the caller. We don't need to verify
// callingPackage, because we are also limiting to callingUid and know
// that will limit to the correct security sandbox.
if (tr.effectiveUid != callingUid) {
continue;
}
Intent intent = tr.getBaseIntent();
if (intent == null ||
!callingPackage.equals(intent.getComponent().getPackageName())) {
continue;
}
ActivityManager.RecentTaskInfo taskInfo =
createRecentTaskInfoFromTaskRecord(tr);
AppTaskImpl taskImpl = new AppTaskImpl(taskInfo.persistentId, callingUid);
list.add(taskImpl);
}
} finally {
Binder.restoreCallingIdentity(ident);
}
return list;
}
}
~~~
不了解Android 中的跨進程通信,也許對上述代碼理解起來會比較困難。