本文系做者本身學習之所用,文章內容僅出自做者拙劣之思考,問題之處煩請不吝指教。函數
在frameworks\av\media\libmedia\mediaplayer.cpp中會有語句:const sp<IMediaPlayerService>& service(getMediaPlayerService()); 來創建MediaPlayerService的binder接口,那麼這個getMediaPlayerService()是如何工做的呢,這篇文章簡單看一下。學習
本文涉及到的源文件:spa
frameworks/av/include/media/mediaplayer.hcode
frameworks/av/media/libmedia/mediaplayer.cppserver
frameworks/av/include/media/IMediaDeathNotifier.hblog
frameworksav/media/libmedia/IMediaDeathNotifier.cpp繼承
首先咱們要明確的是,getMediaPlayerService() 是IMediaDeathNotifier類的公有靜態成員函數,而MediaPlayer繼承自IMediaDeathNotifier,因此能夠直接引用。接口
getMediaPlayerService() 在IMediaDeathNotifier類中的聲明:get
1 class IMediaDeathNotifier: virtual public RefBase 2 { 3 public: 4 ...... 5 static const sp<IMediaPlayerService>& getMediaPlayerService(); // 靜態、公有 6 ...... 7 };
MediaPlayer繼承自IMediaDeathNotifier:it
1 class MediaPlayer : public BnMediaPlayerClient, 2 public virtual IMediaDeathNotifier // 注意繼承關係 3 { 4 ....... 5 }
重點看一下getMediaPlayerService()方法的定義:
1 // establish binder interface to MediaPlayerService
2 /*static*/const sp<IMediaPlayerService>&
3 IMediaDeathNotifier::getMediaPlayerService() 4 { 5 ALOGV("getMediaPlayerService"); 6 Mutex::Autolock _l(sServiceLock); 7 if (sMediaPlayerService == 0) { 8 sp<IServiceManager> sm = defaultServiceManager(); // 首先獲得ServiceManager的引用
9 sp<IBinder> binder; 10 do { 11 binder = sm->getService(String16("media.player")); // 向ServiceManager申請服務
12 if (binder != 0) { 13 break; 14 } 15 ALOGW("Media player service not published, waiting..."); 16 usleep(500000); // 0.5 s
17 } while (true); 18
19 if (sDeathNotifier == NULL) { 20 sDeathNotifier = new DeathNotifier(); 21 } 22 binder->linkToDeath(sDeathNotifier); 23 sMediaPlayerService = interface_cast<IMediaPlayerService>(binder); // 類型轉換爲IMediaPlayerService
24 } 25 ALOGE_IF(sMediaPlayerService == 0, "no media player service!?"); 26 return sMediaPlayerService; 27 }
上面這段代碼的函數實現就是典型的經過ServiceManager獲取binder服務的過程。
順便提一下,MediaPlayerService的註冊是在 mediaserver (frameworks/av/media/mediaserver/main_mediaserver.cpp)中完成的
1 int main(int argc __unused, char** argv) 2 { 3 ...... 4 MediaPlayerService::instantiate(); 5 ...... 6 }
MediaPlayerService的instantiate函數:
1 void MediaPlayerService::instantiate() { 2 defaultServiceManager()->addService( 3 String16("media.player"), new MediaPlayerService()); 4 }