Java层的Binder服务实现

xiaoxiao2021-02-28  67

我们调用系统服务的时候,发生了什么过程?

以查询系统中所有的运行的服务为例,我们采用api

ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); List<ActivityManager.RunningServiceInfo> runningServices = activityManager.getRunningServices(100); // ActivityManagerNative.getDefault() // .getServices(maxNum, 0); for (ActivityManager.RunningServiceInfo s : runningServices) { Log.e("RunningServiceInfo", s.service+""); }

实际上是

return ActivityManagerNative.getDefault() .getServices(maxNum, 0); 继续跟踪

/** * Retrieve the system's default/global activity manager. */ static public IActivityManager getDefault() { return gDefault.get(); }

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; } }; 这里出现一个很有意思的单例类写法,最后说明。

这段代码中我们看到,这里其实是先通过IBinder b = ServiceManager.getService("activity"); 获取ActivityManager的Binder对象(“activity”是ActivityManagerService的Binder服务标识),接着我们再来看一下asInterface(b)的实现:

/** * Cast a Binder object into an activity manager interface, generating * a proxy if needed. */ 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); }

这里应该是比较明白了:首先通过queryLocalInterface确定有没有本地Binder,如果有的话直接返回,否则创建一个ActivityManagerProxy对象。很显然,假设在ActivityManagerService所在的进程调用这个方法,那么queryLocalInterface将直接返回本地Binder,而假设在其他进程中调用,这个方法将返回空,由此导致其他调用获取到的对象其实就是ActivityManagerProxy。而在拿到ActivityManagerProxy对象之后在调用其方法所走的路线我想读者应该也能明白了:那就是通过Binder驱动跨进程调用ActivityManagerService中的方法。

顺便学习一下单例类的google的写法:

/**  * Singleton helper class for lazily initialization.  *  * Modeled after frameworks/base/include/utils/Singleton.h  *  * @hide  */ public abstract class Singleton<T> {     private T mInstance;     protected abstract T create();     public final T get() {         synchronized (this) {             if (mInstance == null) {                 mInstance = create();             }             return mInstance;         }     } }

这是一种懒汉加载,get时才会实例化。

转载请注明原文地址: https://www.6miu.com/read-71876.html

最新回复(0)