Step 7.ActivityManagerService.bringUpServiceLocked

这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityManagerService.java文件中:

        
  1. publicfinalclassActivityManagerServiceextendsActivityManagerNative
  2. implementsWatchdog.Monitor,BatteryStatsImpl.BatteryCallback{
  3. ......
  4. privatefinalbooleanbringUpServiceLocked(ServiceRecordr,
  5. intintentFlags,booleanwhileRestarting){
  6. ......
  7. finalStringappName=r.processName;
  8. ProcessRecordapp=getProcessRecordLocked(appName,r.appInfo.uid);
  9. if(app!=null&&app.thread!=null){
  10. try{
  11. realStartServiceLocked(r,app);
  12. returntrue;
  13. }catch(RemoteExceptione){
  14. ......
  15. }
  16. }
  17. //Notrunning--getitstarted,andenqueuethisservicerecord
  18. //tobeexecutedwhentheappcomesup.
  19. if(startProcessLocked(appName,r.appInfo,true,intentFlags,
  20. "service",r.name,false)==null){
  21. ......
  22. }
  23. ......
  24. }
  25. ......
  26. }

回忆在Android系统中的广播(Broadcast)机制简要介绍和学习计划中一文中,我们没有在程序的AndroidManifest.xml配置文件中设置CounterService的process属性值,因此,它默认就为application标签的process属性值,而application标签的process属性值也没有设置,于是,它们就默认为应用程序的包名了,即这里的appName的值为"shy.luo.broadcast"。接下来根据appName和应用程序的uid值获得一个ProcessRecord记录,由于之前在启动MainActivity的时候,已经根据这个appName和uid值创建了一个ProcessReocrd对象(具体可以参考Android应用程序启动过程源代码分析一文),因此,这里取回来的app和app.thread均不为null,于是,就执行realStartServiceLocked函数来执行下一步操作了。

如果这里得到的ProcessRecord变量app为null,又是什么情况呢?在这种情况下,就会执行后面的startProcessLocked函数来创建一个新的进程,然后在这个新的进程中启动这个Service了,具体可以参考前面一篇文章Android系统在新进程中启动自定义服务过程(startService)的原理分析。

Step 8.ActivityManagerService.realStartServiceLocked

这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityManagerService.java文件中:

        
  1. publicfinalclassActivityManagerServiceextendsActivityManagerNative
  2. implementsWatchdog.Monitor,BatteryStatsImpl.BatteryCallback{
  3. ......
  4. privatefinalvoidrealStartServiceLocked(ServiceRecordr,
  5. ProcessRecordapp)throwsRemoteException{
  6. ......
  7. r.app=app;
  8. ......
  9. app.services.add(r);
  10. ......
  11. try{
  12. ......
  13. app.thread.scheduleCreateService(r,r.serviceInfo);
  14. ......
  15. }finally{
  16. ......
  17. }
  18. requestServiceBindingsLocked(r);
  19. ......
  20. }
  21. ......
  22. }

这个函数执行了两个操作,一个是操作是调用app.thread.scheduleCreateService函数来在应用程序进程内部启动CounterService,这个操作会导致CounterService的onCreate函数被调用;另一个操作是调用requestServiceBindingsLocked函数来向CounterService要一个Binder对象,这个操作会导致CounterService的onBind函数被调用。

这里,我们先沿着app.thread.scheduleCreateService这个路径分析下去,然后再回过头来分析requestServiceBindingsLocked的调用过程。这里的app.thread是一个Binder对象的远程接口,类型为ApplicationThreadProxy。每一个Android应用程序进程里面都有一个ActivtyThread对象和一个ApplicationThread对象,其中是ApplicationThread对象是ActivityThread对象的一个成员变量,是ActivityThread与ActivityManagerService之间用来执行进程间通信的,具体可以参考Android应用程序启动过程源代码分析一文。

Step 9. ApplicationThreadProxy.scheduleCreateService

这个函数定义在frameworks/base/core/java/android/app/ApplicationThreadNative.java文件中:

        
  1. classApplicationThreadProxyimplementsIApplicationThread{
  2. ......
  3. publicfinalvoidscheduleCreateService(IBindertoken,ServiceInfoinfo)
  4. throwsRemoteException{
  5. Parceldata=Parcel.obtain();
  6. data.writeInterfaceToken(IApplicationThread.descriptor);
  7. data.writeStrongBinder(token);
  8. info.writeToParcel(data,0);
  9. mRemote.transact(SCHEDULE_CREATE_SERVICE_TRANSACTION,data,null,
  10. IBinder.FLAG_ONEWAY);
  11. data.recycle();
  12. }
  13. ......
  14. }

这里通过Binder驱动程序就进入到ApplicationThread的scheduleCreateService函数去了。

Step 10.ApplicationThread.scheduleCreateService
这个函数定义在frameworks/base/core/java/android/app/ActivityThread.java文件中:

        
  1. publicfinalclassActivityThread{
  2. ......
  3. privatefinalclassApplicationThreadextendsApplicationThreadNative{
  4. ......
  5. publicfinalvoidscheduleCreateService(IBindertoken,
  6. ServiceInfoinfo){
  7. CreateServiceDatas=newCreateServiceData();
  8. s.token=token;
  9. s.info=info;
  10. queueOrSendMessage(H.CREATE_SERVICE,s);
  11. }
  12. ......
  13. }
  14. ......
  15. }

这里它执行的操作就是调用ActivityThread的queueOrSendMessage函数把一个H.CREATE_SERVICE类型的消息放到ActivityThread的消息队列中去。

Step 11.ActivityThread.queueOrSendMessage
这个函数定义在frameworks/base/core/java/android/app/ActivityThread.java文件中:

        
  1. publicfinalclassActivityThread{
  2. ......
  3. //ifthethreadhasn'tstartedyet,wedon'thavethehandler,sojust
  4. //savethemessagesuntilwe'reready.
  5. privatefinalvoidqueueOrSendMessage(intwhat,Objectobj){
  6. queueOrSendMessage(what,obj,0,0);
  7. }
  8. privatefinalvoidqueueOrSendMessage(intwhat,Objectobj,intarg1){
  9. queueOrSendMessage(what,obj,arg1,0);
  10. }
  11. privatefinalvoidqueueOrSendMessage(intwhat,Objectobj,intarg1,intarg2){
  12. synchronized(this){
  13. ......
  14. Messagemsg=Message.obtain();
  15. msg.what=what;
  16. msg.obj=obj;
  17. msg.arg1=arg1;
  18. msg.arg2=arg2;
  19. mH.sendMessage(msg);
  20. }
  21. }
  22. ......
  23. }

这个消息最终是通过mH.sendMessage发送出去的,这里的mH是一个在ActivityThread内部定义的一个类,继承于Hanlder类,用于处理消息的。

Step 12. H.sendMessage

由于H类继承于Handler类,因此,这里实际执行的Handler.sendMessage函数,这个函数定义在frameworks/base/core/java/android/os/Handler.java文件,这里我们就不看了,有兴趣的读者可以自己研究一下,调用了这个函数之后,这个消息就真正地进入到ActivityThread的消息队列去了,最终这个消息由H.handleMessage函数来处理,这个函数定义在frameworks/base/core/java/android/app/ActivityThread.java文件中:

        
  1. publicfinalclassActivityThread{
  2. ......
  3. privatefinalclassHextendsHandler{
  4. ......
  5. publicvoidhandleMessage(Messagemsg){
  6. ......
  7. switch(msg.what){
  8. ......
  9. caseCREATE_SERVICE:
  10. handleCreateService((CreateServiceData)msg.obj);
  11. break;
  12. ......
  13. }
  14. }
  15. }
  16. ......
  17. }

这个消息最终由ActivityThread的handleCreateService函数来处理。

Step 13.ActivityThread.handleCreateService
这个函数定义在frameworks/base/core/java/android/app/ActivityThread.java文件中:

        
  1. publicfinalclassActivityThread{
  2. ......
  3. privatefinalvoidhandleCreateService(CreateServiceDatadata){
  4. ......
  5. LoadedApkpackageInfo=getPackageInfoNoCheck(
  6. data.info.applicationInfo);
  7. Serviceservice=null;
  8. try{
  9. java.lang.ClassLoadercl=packageInfo.getClassLoader();
  10. service=(Service)cl.loadClass(data.info.name).newInstance();
  11. }catch(Exceptione){
  12. ......
  13. }
  14. try{
  15. ......
  16. ContextImplcontext=newContextImpl();
  17. context.init(packageInfo,null,this);
  18. Applicationapp=packageInfo.makeApplication(false,mInstrumentation);
  19. context.setOuterContext(service);
  20. service.attach(context,this,data.info.name,data.token,app,
  21. ActivityManagerNative.getDefault());
  22. service.onCreate();
  23. mServices.put(data.token,service);
  24. ......
  25. }catch(Exceptione){
  26. ......
  27. }
  28. }
  29. ......
  30. }

这个函数的工作就是把CounterService类加载到内存中来,然后调用它的onCreate函数。

Step 14. CounterService.onCreate

这个函数定义在Android系统中的广播(Broadcast)机制简要介绍和学习计划中一文中所介绍的应用程序Broadcast的工程目录下的src/shy/luo/broadcast/CounterService.java文件中:

        
  1. publicclassCounterServiceextendsServiceimplementsICounterService{
  2. ......
  3. @Override
  4. publicvoidonCreate(){
  5. super.onCreate();
  6. Log.i(LOG_TAG,"CounterServiceCreated.");
  7. }
  8. ......
  9. }

这样,CounterService就启动起来了。

至此,应用程序绑定服务过程中的第一步MainActivity.bindService->CounterService.onCreate就完成了。

这一步完成之后,我们还要回到Step 8中去,执行下一个操作,即调用ActivityManagerService.requestServiceBindingsLocked函数,这个调用是用来执行CounterService的onBind函数的。 Step 15.ActivityManagerService.requestServiceBindingsLocked

这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityManagerService.java文件中:

        
  1. publicfinalclassActivityManagerServiceextendsActivityManagerNative
  2. implementsWatchdog.Monitor,BatteryStatsImpl.BatteryCallback{
  3. ......
  4. privatefinalvoidrequestServiceBindingsLocked(ServiceRecordr){
  5. Iterator<IntentBindRecord>bindings=r.bindings.values().iterator();
  6. while(bindings.hasNext()){
  7. IntentBindRecordi=bindings.next();
  8. if(!requestServiceBindingLocked(r,i,false)){
  9. break;
  10. }
  11. }
  12. }
  13. privatefinalbooleanrequestServiceBindingLocked(ServiceRecordr,
  14. IntentBindRecordi,booleanrebind){
  15. ......
  16. if((!i.requested||rebind)&&i.apps.size()>0){
  17. try{
  18. ......
  19. r.app.thread.scheduleBindService(r,i.intent.getIntent(),rebind);
  20. ......
  21. }catch(RemoteExceptione){
  22. ......
  23. }
  24. }
  25. returntrue;
  26. }
  27. ......
  28. }

这里的参数r就是我们在前面的Step 6中创建的ServiceRecord了,它代表刚才已经启动了的CounterService。函数requestServiceBindingsLocked调用了requestServiceBindingLocked函数来处理绑定服务的操作,而函数requestServiceBindingLocked又调用了app.thread.scheduleBindService函数执行操作,前面我们已经介绍过app.thread,它是一个Binder对象的远程接口,类型是ApplicationThreadProxy。 Step 16.ApplicationThreadProxy.scheduleBindService

这个函数定义在frameworks/base/core/java/android/app/ApplicationThreadNative.java文件中:

        
  1. classApplicationThreadProxyimplementsIApplicationThread{
  2. ......
  3. publicfinalvoidscheduleBindService(IBindertoken,Intentintent,booleanrebind)
  4. throwsRemoteException{
  5. Parceldata=Parcel.obtain();
  6. data.writeInterfaceToken(IApplicationThread.descriptor);
  7. data.writeStrongBinder(token);
  8. intent.writeToParcel(data,0);
  9. data.writeInt(rebind?1:0);
  10. mRemote.transact(SCHEDULE_BIND_SERVICE_TRANSACTION,data,null,
  11. IBinder.FLAG_ONEWAY);
  12. data.recycle();
  13. }
  14. ......
  15. }

这里通过Binder驱动程序就进入到ApplicationThread的scheduleBindService函数去了。

更多相关文章

  1. 箭头函数的基础使用
  2. Python技巧匿名函数、回调函数和高阶函数
  3. Android(安卓)PKMS深入分析安装应用
  4. Android应用程序(activity)启动过程(一)
  5. 使用代码为textview设置drawableLeft
  6. android解锁触发广播
  7. ListView取消和自定义分割线的方法
  8. Android(安卓)异步消息处理机制
  9. 【Gradle】自定义Android(安卓)Gradle工程

随机推荐

  1. Android(安卓)socket通信
  2. Android(安卓)ProgressBar使用
  3. Pull To Refresh for Android
  4. android从网上下载图片
  5. Android与服务器通信
  6. android之ID
  7. 毕设---android按钮事件
  8. Android(安卓)Fragment 简洁版 list
  9. android每隔5s显示时间
  10. android ScrollView 多张图片之间有空白