• 1. 第5章 Android Service
  • 2. 内容概要 Service简介; Local Service; Remote Service.
  • 3. Service简介 Android中的Service和windows中的Service是类似的东西,Service一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序。 Service与Thread的区别 Servie是系统的组件,它由系统进程托管(ServiceManager);它们之间的通信类似于client和server,是一种轻量级的ipc通信,这种通信的载体是binder,它是在linux层交换信息的一种ipc。而thread是由本应用程序托管。
  • 4. Service简介 Thread:Thread 是程序执行的最小单元,它是分配CPU的基本单位。可以用 Thread 来执行一些异步的操作。 Service:Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的 Service 是运行在主进程的 main 线程上的。如:onCreate,onStart 这些函数在被系统调用的时候都是在主进程的 main 线程上运行的。如果是Remote Service,那么对应的 Service 则是运行在独立进程的 main 线程上。
  • 5. Service简介 既然这样,那么我们为什么要用 Service 呢?其实这跟 android 的系统机制有关,我们先拿 Thread 来说。Thread 的运行是独立于 Activity 的,也就是说当一个 Activity 被 finish 之后,如果你没有主动停止 Thread 或者 Thread 里的 run 方法没有执行完毕的话,Thread 也会一直执行。因此这里会出现一个问题:当 Activity 被 finish 之后,你不再持有该 Thread 的引用。因此,在Activity里使用Thread是不安全的。
  • 6. Service简介 所以,你便需要创建并启动一个 Service ,在 Service 里面创建、运行并控制该 Thread,这样便解决了该问题(因为任何 Activity 都可以控制同一 Service,而系统也只会创建一个对应 Service 的实例)。 你可以把 Service 想象成一种消息服务,而你可以在任何有 Context 的地方调用 Context.startService、Context.stopService、Context.bindService,Context.unbindService,来控制它,你也可以在 Service 里注册 BroadcastReceiver,在其他地方通过发送 broadcast 来控制它,当然这些都是 Thread 做不到的。
  • 7. Service的生命周期 与Activity具有生命周期方法一样,Service也同样具有生命周期,这些生命周期方法包括onCreate, onStart,onBind,onUnbind,onDestroy等。 启动Service的两种方式: startService方式; bindSerivce方式。
  • 8. Service的启动方式-startService 当你使用startService启动一个Service时,系统会依次调用onCreate,onStart或onStartCommand方法。 使用stopService停止一个Service时,系统会调用onDestroy方法。 通过startService方式启动一个服务时,你必须调用stopService来停止一个Service。
  • 9. Service的启动方式 startService方式的步骤: 1) 在Manifest.xml文件中添加service标签,示例代码如下:
  • 10. Service的启动方式2) 调用startService方法启动Service Intent intent = new Intent (this,TestService.class); this.startService(intent); 或者 Intent intent = new Intent("com.shen.service.MyService"); this.startService(intent);
  • 11. Service的启动方式3) 调用stopService方法停止Service Intent intent = new Intent (this,TestService.class); this.stopService(intent); 或者 Intent intent = new Intent("com.shen.service.MyService"); this.stopService(intent);
  • 12. Service的启动方式-bindService 当你使用bindService启动一个Service时,系统会依次调用onCreate,onBind方法。 使用unbindService停止一个Service时,系统会调用onUnbind,onDestroy方法。 通过bindService方式启动一个服务时,被启动的服务就与Activity绑定在一起了,当Activity被销毁时,该服务即停止。
  • 13. Service的启动方式-bindService bindService方式启动一个服务的步骤如下 1)在Manifest.xml文件中添加service标签,示例代码如下:
  • 14. Service的启动方式-bindService2) 调用bindService方法绑定并启动Service Intent intent = new Intent(MainServiceActivity.this,TestService.class); MainServiceActivity.this.bindService(intent, sc, Context.BIND_AUTO_CREATE); 或者 Intent intent = new Intent("com.shen.service.MyService"); MainServiceActivity.this.bindService(intent, sc, Context.BIND_AUTO_CREATE);
  • 15. Service的启动方式-bindService3) 调用unbindService方法停止Service Intent intent = new Intent(MainServiceActivity.this,TestService.class); MainServiceActivity.this.unbindService(sc); 或者 Intent intent = new Intent("com.shen.service.MyService"); MainServiceActivity.this.unbindService(sc);
  • 16. Remote Service 在Andorid平台中,各个组件运行在自己的进程中,他们之间是不能相互访问的,但是在程序之间是不可避免的要传递一些对象,在进程之间相互通信。为了实现进程之间的相互通信,Andorid采用了一种轻量级的实现方式RPC(Remote Procedure Call 远程进程调用)来完成进程之间的通信,并且Android通过接口定义语言(Android Interface Definition Language ,AIDL)来生成两个进程之间相互访问的代码,例如,你在Activity里的代码需要访问Service中的一个方法,那么就可以通过这种方式来实现了。
  • 17. Remote Service AIDL是Android的一种接口描述语言; 编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信的目的. 如果需要在一个Activity中, 访问另一个Service中的某个对象, 需要先将对象转化成 AIDL可识别的参数(可能是多个参数), 然后使用AIDL来传递这些参数, 在消息的接收端, 使用这些参数组装成自己需要的对象。 AIDL RPC机制是通过接口来实现的,类似Windows中的COM或者Corba,但他是轻量级的,客户端和被调用实现之间是通过代理模式实现的,代理类和被代理类实现同一个接口Ibinder接口。
  • 18. Remote Service 实现远程服务调用的步骤如下: 服务器端 1) 创建aidl文件; AIDL使用简单的语法来声明接口,描述其方法以及方法的参数和返回值。这些参数和返回值可以是任何类型,甚至是其他AIDL生成的接口。重要的是必须导入除了内建类型(例如:int,boolean等)外的任何其他类型,哪怕是这些类型是在与接口相同的包中。具体的要求如下:
  • 19. Remote Service JAVA基本数据类型不需要导入; String,List,Map和CharSequence不需要导入. 我们需要在工程里的src下创建一个aidl文件,创建完后,eclipse会自动生成一个同名的JAVA 文件. 2) 实现AIDL文件生成的JAVA接口; AIDL会生成一个和.aidl文件同名的JAVA接口文件,该接口中有一个静态抽象内部类Stub,该类中声明了AIDL文件中定义的所有方法,其中有一个重要的方法是asInterface(),该方法通过代理模式返回JAVA接口的实现类。
  • 20. Remote Service 3)向客户端暴露接口 一般通过定义一个Service来实现,在Service的onBind()方法中返回该接口,当我们绑定该接口时调用该方法。 客户端调用远程Service 定义一个Activity来绑定远程Service,获得Service接口,通过RPC机制调用接口中的方法。
  • 21. Thanks!