Android的AMS如何呼叫Service::onBind()函?
2010-05-31 14:29:00 来源:WEB开发网AMS是ActivityManagerService之?费。?你?Activity呼叫bindService()?候,?弈而呼叫AMS::bindService()函?。此AMS::bindService()再呼叫AMS::requestServiceBindingLocked()函?。此AMS::requestServiceBindingLocked()再呼叫ActivityThread::scheduleBindService()函?。
ActivityThread::scheduleBindService()函?的?作包括:
*********************** *************************
依?Acivity呼叫bindService(??)?候的???容(如data.token),而?HashMap
Service s = mServices.get(data.token);
接著呼叫:
data.intent.setExtrasClassLoader(s.getClassLoader());
IBinder binder = s.onBind(data.intent);
?data的intent(?自Acivity呼叫bindService(??)的intent)?斤onBind(),
?行了onBind()函?,就回?myBinder物件了。
*********************** *************************
取得myBinder物件之後;接著,AMP.publishService(data.token, data.intent, binder);呼叫JNI Native函?:android_os_Parcel_writeStrongBinder()
?行其?的:parcel->writeStrongBinder( ibinderForJavaObject(env, object));
其中,ibinderForJavaObject()取得陪myBinder物件相?的JavaBBinderHolder物件。然後,env->IsInstanceOf(obj, gBinderOffsets.mClass)判?是不是myBinder的物件。此?是True! 於是,?行:env->GetIntField(obj, gBinderOffsets.mObject);就?myBinder::mObject?位取得JavaBBinderHolder物件?考。如下?:
接著,呼叫JavaBBinderHolder的get()函???建 javaBBinder物件:
此get()函?的?作:
---- ?行new JavaBBinder(env, mObject); ?昭生JavaBBinder 物件。
---- 此?,?入的mObject 是先前JavaBBinderHolder建立?所存入的
mObject值,它是myBinder物件?考。
---- mObject(env->NewGlobalRef(object)) 也?myBinder物件?考存入於
更多精彩
赞助商链接