android应用程序绑定服务(bindservice)的过程源代码分析

上传人:xzh****18 文档编号:35445882 上传时间:2018-03-15 格式:DOCX 页数:28 大小:117.04KB
返回 下载 相关 举报
android应用程序绑定服务(bindservice)的过程源代码分析_第1页
第1页 / 共28页
android应用程序绑定服务(bindservice)的过程源代码分析_第2页
第2页 / 共28页
android应用程序绑定服务(bindservice)的过程源代码分析_第3页
第3页 / 共28页
android应用程序绑定服务(bindservice)的过程源代码分析_第4页
第4页 / 共28页
android应用程序绑定服务(bindservice)的过程源代码分析_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《android应用程序绑定服务(bindservice)的过程源代码分析》由会员分享,可在线阅读,更多相关《android应用程序绑定服务(bindservice)的过程源代码分析(28页珍藏版)》请在金锄头文库上搜索。

1、 Android 应用程序组件 Service 与 Activity 一样,既可以在新的进程中启动,也可以在应用程序进程内部启动;前面我们已经分析了在新的进程中启动 Service 的过程,本文将要介绍在应用程序内部绑定Service 的过程,这是一种在应用程序进程内部启动 Service 的方法。在前面一篇文章 Android 进程间通信(IPC)机制 Binder 简要介绍和学习计划中,我们就曾经提到,在 Android 系统中,每一个应用程序都是由一些 Activity 和 Service 组成的,一般 Service 运行在独立的进程中,而 Activity 有可能运行在同一个进程中,

2、也有可能运行在不同的进程中;在接下来的文章中,Android 系统在新进程中启动自定义服务过程(startService)的原理分析一文介绍了在新的进程中启动Service 的过程,Android 应用程序启动过程源代码分析一文介绍了在新的进程中启动 Activity 的过程,而Android 应用程序内部启动 Activity 过程(startActivity)的源代码分析一文则介绍了在应用程序进程内部启动 Activity 的过程;本文接过最后一棒,继续介绍在应用程序进程内部启动 Service 的过程,这种过程又可以称在应用程序进程内部绑定服务(bindService)的过程,这样,读者

3、应该就可以对 Android 应用程序启动 Activity 和 Service 有一个充分的认识了。这里仍然是按照老规矩,通过具体的例子来分析 Android 应用程序绑定 Service 的过程,而所使用的例子便是前面我们在介绍 Android 系统广播机制的一篇文章 Android 系统中的广播(Broadcast)机制简要介绍和学习计划中所开发的应用程序 Broadcast 了。我们先简单回顾一下这个应用程序实例绑定 Service 的过程。在这个应用程序的 MainActivity 的onCreate 函数中,会调用 bindService 来绑定一个计数器服务 CounterSer

4、vice,这里绑定的意思其实就是在 MainActivity 内部获得 CounterService 的接口,所以,这个过程的第一步就是要把 CounterService启动起来。当 CounterService 的 onCreate 函数被调用起来了,就说明 CounterService 已经启动起来了,接下来系统还要调用 CounterService 的 onBind 函数,跟 CounterService 要一个 Binder 对象,这个Binder 对象是在 CounterService 内部自定义的 CounterBinder 类的一个实例,它继承于 Binder 类,里面实现一个

5、getService 函数,用来返回外部的 CounterService 接口。系统得到这个 Binder 对象之后,就会调用 MainActivity 在 bindService 函数里面传过来的 ServiceConnection 实例的 onServiceConnected 函数,并把这个 Binder 对象以参数的形式传到 onServiceConnected 函数里面,于是,MainActivity 就可以调用这个 Binder 对象的 getService 函数来获得 CounterService 的接口了。这个过程比较复杂,但总体来说,思路还是比较清晰的,整个调用过程为 Main

6、Activity.bindService-CounterService.onCreate-CounterService.onBind-MainActivity.ServiceConnection.onServiceConnection-CounterService.CounterBinder.getService。下面,我们就先用一个序列图来总体描述这个服务绑定的过程,然后就具体分析每一个步骤。点击查看大图Step 1. ContextWrapper.bindService这个函数定义在 frameworks/base/core/java/android/content/ContextWrap

7、per.java 文件中:view plain1.public class ContextWrapper extends Context 2. Context mBase; 3. . 4. 5. Override 6. public boolean bindService(Intent service, ServiceConnection conn, 7. int flags) 8. return mBase.bindService(service, conn, flags); 9. 10. 11. . 12. 这里的 mBase 是一个 ContextImpl 实例变量,于是就调用 Cont

8、extImpl 的 bindService 函数来进一步处理。Step 2. ContextImpl.bindService这个函数定义在 frameworks/base/core/java/android/app/ContextImpl.java 文件中:view plain1.class ContextImpl extends Context 2. . 3. 4. Override 5. public boolean bindService(Intent service, ServiceConnection conn, 6. int flags) 7. IServiceConnection

9、 sd; 8. if (mPackageInfo != null) 9. sd = mPackageInfo.getServiceDispatcher(conn, getOuterContext(), 10. mMainThread.getHandler(), flags); 11. else 12. . 13. 14. try 15. int res = ActivityManagerNative.getDefault().bindService( 16. mMainThread.getApplicationThread(), getActivityToken(), 17. service,

10、 service.resolveTypeIfNeeded(getContentResolver(), 18. sd, flags); 19. . 20. return res != 0; 21. catch (RemoteException e) 22. return false; 23. 24. 25. 26. . 27. 28. 这里的 mMainThread 是一个 ActivityThread 实例,通过它的 getHandler 函数可以获得一个 Handler对象,有了这个 Handler 对象后,就可以把消息分发到 ActivityThread 所在的线程消息队列中去了,后面我们

11、将会看到这个用法,现在我们暂时不关注,只要知道这里从 ActivityThread 处获得了一个 Handler 并且保存在下面要介绍的 ServiceDispatcher 中去就可以了。我们先看一下 ActivityThread.getHandler 的实现,然后再回到这里的 bindService 函数来。Step 3. ActivityThread.getHandler这个函数定义在 frameworks/base/core/java/android/app/ActivityThread.java 文件中:view plain1.public final class ActivityTh

12、read 2. . 3. 4. final H mH = new H(); 5. 6. . 7. 8. private final class H extends Handler 9. . 10. 11. public void handleMessage(Message msg) 12. . 13. 14. 15. . 16. 17. 18. . 19. 20. final Handler getHandler() 21. return mH; 22. 23. 24. . 25. 这里返回的 Handler 是在 ActivityThread 类内部从 Handler 类继承下来的一个 H

13、类实例变量。回到 Step 2 中的 ContextImpl.bindService 函数中,获得了这个 Handler 对象后,就调用mPackageInfo.getServiceDispatcher 函数来获得一个 IServiceConnection 接口,这里的 mPackageInfo的类型是 LoadedApk,我们来看看它的 getServiceDispatcher 函数的实现,然后再回到ContextImpl.bindService 函数来。Step 4. LoadedApk.getServiceDispatcher这个函数定义在 frameworks/base/core/ja

14、va/android/app/LoadedApk.java 文件中:view plain1.final class LoadedApk 2. . 3. 4. public final IServiceConnection getServiceDispatcher(ServiceConnection c, 5. Context context, Handler handler, int flags) 6. synchronized (mServices) 7. LoadedApk.ServiceDispatcher sd = null; 8. HashMap map = mServices.get(context); 9. if (map != null) 10. sd = map.get(c); 11. 12. if (sd = null) 13. sd = new ServiceDispatcher(c, context, handler, flags); 14. if (map

展开阅读全文
相关资源
相关搜索

当前位置:首页 > IT计算机/网络 > 多媒体应用

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号