WEB开发网
开发学院手机开发Android 开发 Android的AMS如何呼叫Service::onBind()函? 阅读

Android的AMS如何呼叫Service::onBind()函?

 2010-05-31 14:29:00 来源:WEB开发网   
核心提示:AMS是ActivityManagerService之?费,?你?Activity呼叫bindService()?候,Android的AMS如何呼叫Service::onBind()函?,?弈而呼叫AMS::bindService()函?,此AMS::bindService()再呼叫AMS::requestServic

AMS是ActivityManagerService之?费。?你?Activity呼叫bindService()?候,?弈而呼叫AMS::bindService()函?。此AMS::bindService()再呼叫AMS::requestServiceBindingLocked()函?。此AMS::requestServiceBindingLocked()再呼叫ActivityThread::scheduleBindService()函?。

ActivityThread::scheduleBindService()函?的?作包括:

*********************** *************************

依?Acivity呼叫bindService(??)?候的???容(如data.token),而?HashMap:mServices彦找出目的Service。如下指令:

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物件?考。如下?:

<a target=Android的AMS如何呼叫Service::on<wbr>Bind()函? - On<wbr>ce - 许兴旺的博客" src="http://www.cnmsdn.com/attached/201005/20100530170531_28537.jpg" width="498" border="1" height="352" onload="return imgzoom(this,550);" onclick="javascript:window.open(this.src);" style="cursor:pointer;"/>

接著,呼叫JavaBBinderHolder的get()函???建 javaBBinder物件:

此get()函?的?作:

---- ?行new JavaBBinder(env, mObject); ?昭生JavaBBinder 物件。

---- 此?,?入的mObject 是先前JavaBBinderHolder建立?所存入的

mObject值,它是myBinder物件?考。

---- mObject(env->NewGlobalRef(object)) 也?myBinder物件?考存入於

1 2  下一页

Tags:Android AMS 如何

编辑录入:coldstar [复制链接] [打 印]
赞助商链接