Android开发之MediaPlayerService服务详解(一)

       前面一节我们分析了Binder通信相关的两个重要类:ProcessState 和 IPCThreadState。ProcessState负责打开Binder
驱动,每个进程只有一个。而 IPCThreadState负责提供与Binder通信相关的接口,每个线程有一个。下面我们通过具体
示例MediaPlayerService来分析我们应用程序中怎么通过Binder通信的。


frameworks/base/media/mediaserver/main_mediaserver.cpp

int main(int argc, char*argv[])
{
	sp<ProcessState> proc(ProcessState)::self();	// 获得ProcessState在构造函数中打开binder驱动
	sp<IServiceManager> sm = defaultServiceManager();
	MediaPlayService::instantiate();
	ProcessState::self()->startThreadPool();
	IPCThreadState::self()->joinThreadPool();
}

1)获得ServiceManager的代理BpServiceManager

sp<IServiceManager> sm = defaultServiceManager();
sp<IServiceManager> defaultServiceManager()
{
	if(gDefaultServiceManager != NULL) return gDefaultServiceManager;
	{
		AutoMutex -l(gDefaultServiceManagerLock);
		if(gDefaultServiceManager == NULL)
			gDefaultServiceManager = interface_cast<IServiceManager>(
				ProcessState::self()->getContextObject(NULL));
	}
	return gDefaultServiceManager;
}

这里又是一个单例模式,每个进程只需要一个BpServiceManager代理,通过interface_cast获得。
首先看看ProcessState::self()->getContextObject(NULL)

sp<IBinder> ProcessState::getContextObject(const sp<IBinder>& caller)
{
	return getStrongProxyForHandle(0);
}

sp<IBinder> ProcessState::getStrongProxyForHandle(int32_t handle)	
{
	sp<IBinder> result;
	AutoMutex _l(mLock);
	handle_entry *e = lookupHandleLocked(handle);
	if( e != NULL) {
		IBinder* b = e->binder;
		if(b == NULL || !e->refs->attemptIncWeak(this)) {
			b = new BpBinder(handle);
			e->binder = b;
			if(b) e->refs = b->getWeakRefs();
			result = b;
		}else{
			result.force_set(b);
			e->refs->decWeak(this);
		}
	}
	return result;
}
struct handle_entry{
	IBinder* binder;
	RefBase::weakref_type* refs;
}

ProcessState::handle_entry* ProcessState::lookupHandleLocked()从数组mHandleToObject里面根据handle索引,查找
一个handle_entry结构体。然后根据传入的句柄handle这里为0,表示ServiceManager,new一个BpBinder
所以现在相当于:
gDefaultServiceManager = interface_cast<IServiceManager>(new BpBinder(0));

现在我们看看interface_cast是什么?

frameworks/base/include/binder/IInterface.h
template<typename INTERFACE>
inline sp<INTERFACE> interface_cast(const sp<IBinder>& obj)
{
	return INTERFACE::asInterface(obj);
}
等价于:
inline sp<IServiceManager> interface_cast(const sp<IBinder>& obj)
{
	return IServiceManager::asInterface(obj);
}
继续我们跟到IServiceManager里面去:
frameworks/base/include/binder/IServiceManager.h
class IServiceManager:public IInterface
{
public:
	DECLARE_META_INTERFACE(ServiceManager);// MLGB的又是宏!!!
	virtual status_t addService(const String16& name, const sp<IBinder>& service) = 0;
	virtual sp<IBinder> getService(const String16& name) const = 0;
}
#define DECLARE_META_INTERFACE(INTERFACE)				\
	static const android::String16 descriptor;			\
	static android::sp<I##INTERFACE> asInterface(			\
			const android::sp<android::IBinder>& obj);	\
	virtual const android::String16& getInterfaceDescriptor() const;\
	I##INTERFACE();							\
	virtual !I##I
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值