笔记54--service状态之startService
2014-07-07 21:14
176 查看
上一篇实在干货太多,我都不想看。这篇参考:http://android.blog.51cto.com/268543/527314
一、两种状态比较
service的两种模式(startService()/bindService()不是完全分离的,可以一起用,见上一篇)。
startService():它可以启动并运行,直至有人停止了它或它自己停止。在这种方式下,它以Context.startService()启动,而以调用Context.stopService()结束。它可以调用Service.stopSelf()或Service.stopSelfResult()来自己停止。无论调用多少次startService(),你只需调用一次stopService()来停止服务。
bindService():它可以通过自己定义并暴露出来的接口进行程序操作。客户端建立一个到服务对象的连接,并通过那个连接来调用服务。连接以调用Context.bindService()方法建立,以调用Context.unbindService()关闭(绑定service的所有组件的生命周期结束也会导致service关闭)。多个客户端可以绑定至同一个服务。如果此时服务还没有加载,bindService()会先加载它。
还是上一篇讲的全面,这儿讲的两种模式偏重代码实现。
比较:服务不能自己运行,需要通过Context.startService()或Context.bindService()来启动服务。
startService()启用服务:调用者与服务者之间没有关联,即使调用者退出,服务仍然运行。服务未创建时会执行onCreate()方法,若已经创建,多次调用startService()只会多次调用onStartCommond()。
bindService()启用服务:调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。onBind()方法只有采用Context.bindService()方法启动服务时才会回调该方法。当调用者与服务者已经绑定,多次调用Context.bindService()并不会导致该方法被多次调用。
对同一个service调用了startService()和bindService():要结束此service,两种模式的结束方法必须都调用到。
当旋转手机屏幕时,当手机屏幕在“横”、“竖”变换时,此时如果你的activity会自动旋转的话,旋转其实是activity的重建,因此旋转之前的使用bindService()建立的连接会断开(Context不存在了),对应的服务的生命周期也会停止。
二、startService()原理
首先自定义一个service类,然后(从context或者service)调用startService()启动一个服务,最后,同activity一样,记得在AndroidMainfest.xml中声明。
三、startService()代码实现
上源码
四、Service的一个子类:IntentService
IntentService:使用一个工作线程来处理所有的启动请求,一次处理一个。这是你不需要你的service同时处理多个请求时的最好选择。你所要做的就是实现onHandleIntent(),这个方法接受每次请求发来的intent,于是你可以做后台的工作。
通俗点说:对耗时操作,一般的Service需要另开线程;而IntentService就可直接在里面进行耗时操作,因它默认实现了一个worker thread。对于异步的startService请求,IntenService是最简单的选择。
IntentService做了以下工作:
创建一个默认的工作线程在主线程之外执行所有派发到onStartCommand()的intent.
创建一个工作队列,某个时间只传递一个intent到你的onHandleIntent()实现中,于是你不必担心多线程的问题.
当所有开始的请求都处理后,停止service,所以你永远不需调用stopSelf().
提供onBind()的默认实现,返回null.
提供一个onStartCommand()的默认实现,把intent加入到工作队列之后会传给你的onHandleIntent()实现.
需求:在Android开发中,我们或许会碰到这么一种业务需求,一项任务分成几个子任务,子任务按顺序先后执行,子任务全部执行完后,这项任务才算成功。那么,利用几个子线程顺序执行是可以达到这个目的的,但是每个线程必须去手动控制,而且得在一个子线程执行完后,再开启另一个子线程。或者,全部放到一个线程中让其顺序执行。这样都可以做到,但是,如果这是一个后台任务,就得放到Service里面,由于Service和Activity是同级的,所以,要执行耗时任务,就得在Service里面开子线程来执行。那么,有没有一种简单的方法来处理这个过程呢,答案就是IntentService。
一、两种状态比较
service的两种模式(startService()/bindService()不是完全分离的,可以一起用,见上一篇)。
startService():它可以启动并运行,直至有人停止了它或它自己停止。在这种方式下,它以Context.startService()启动,而以调用Context.stopService()结束。它可以调用Service.stopSelf()或Service.stopSelfResult()来自己停止。无论调用多少次startService(),你只需调用一次stopService()来停止服务。
bindService():它可以通过自己定义并暴露出来的接口进行程序操作。客户端建立一个到服务对象的连接,并通过那个连接来调用服务。连接以调用Context.bindService()方法建立,以调用Context.unbindService()关闭(绑定service的所有组件的生命周期结束也会导致service关闭)。多个客户端可以绑定至同一个服务。如果此时服务还没有加载,bindService()会先加载它。
还是上一篇讲的全面,这儿讲的两种模式偏重代码实现。
比较:服务不能自己运行,需要通过Context.startService()或Context.bindService()来启动服务。
startService()启用服务:调用者与服务者之间没有关联,即使调用者退出,服务仍然运行。服务未创建时会执行onCreate()方法,若已经创建,多次调用startService()只会多次调用onStartCommond()。
bindService()启用服务:调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。onBind()方法只有采用Context.bindService()方法启动服务时才会回调该方法。当调用者与服务者已经绑定,多次调用Context.bindService()并不会导致该方法被多次调用。
对同一个service调用了startService()和bindService():要结束此service,两种模式的结束方法必须都调用到。
当旋转手机屏幕时,当手机屏幕在“横”、“竖”变换时,此时如果你的activity会自动旋转的话,旋转其实是activity的重建,因此旋转之前的使用bindService()建立的连接会断开(Context不存在了),对应的服务的生命周期也会停止。
二、startService()原理
首先自定义一个service类,然后(从context或者service)调用startService()启动一个服务,最后,同activity一样,记得在AndroidMainfest.xml中声明。
三、startService()代码实现
Intent intent=new Intent(MainActivity.this,LocalService.class); startService(intent);
<service android:name="com.example.myservice.LocalService"></service>
上源码
四、Service的一个子类:IntentService
IntentService:使用一个工作线程来处理所有的启动请求,一次处理一个。这是你不需要你的service同时处理多个请求时的最好选择。你所要做的就是实现onHandleIntent(),这个方法接受每次请求发来的intent,于是你可以做后台的工作。
通俗点说:对耗时操作,一般的Service需要另开线程;而IntentService就可直接在里面进行耗时操作,因它默认实现了一个worker thread。对于异步的startService请求,IntenService是最简单的选择。
public class HelloIntentService extends IntentService { /** * 一个构造函数是必须的,并且你必须调用父类的IntentService(String)以传入工作线程的名字. */ public HelloIntentService() { super("HelloIntentService"); } /** * IntentService在默认的工作线程中调用这个方法 *当这个方法返回后,IntentService停止服务,如果能停止的话. */ @Override protected void onHandleIntent(Intent intent) { // Normally we would do some work here, like download a file. // For our sample, we just sleep for 5 seconds. long endTime = System.currentTimeMillis() + 5*1000; while (System.currentTimeMillis() < endTime) { synchronized (this) { try { wait(endTime - System.currentTimeMillis()); } catch (Exception e) { } } } } }
IntentService做了以下工作:
创建一个默认的工作线程在主线程之外执行所有派发到onStartCommand()的intent.
创建一个工作队列,某个时间只传递一个intent到你的onHandleIntent()实现中,于是你不必担心多线程的问题.
当所有开始的请求都处理后,停止service,所以你永远不需调用stopSelf().
提供onBind()的默认实现,返回null.
提供一个onStartCommand()的默认实现,把intent加入到工作队列之后会传给你的onHandleIntent()实现.
需求:在Android开发中,我们或许会碰到这么一种业务需求,一项任务分成几个子任务,子任务按顺序先后执行,子任务全部执行完后,这项任务才算成功。那么,利用几个子线程顺序执行是可以达到这个目的的,但是每个线程必须去手动控制,而且得在一个子线程执行完后,再开启另一个子线程。或者,全部放到一个线程中让其顺序执行。这样都可以做到,但是,如果这是一个后台任务,就得放到Service里面,由于Service和Activity是同级的,所以,要执行耗时任务,就得在Service里面开子线程来执行。那么,有没有一种简单的方法来处理这个过程呢,答案就是IntentService。
相关文章推荐
- activity中如何获取service的运行状态? 使用startservice方式启动
- android startService流程梳理笔记
- mysql 安装到最后一步时,start service 为失败状态 请问是什么原因
- Android笔记-service启动过程分析:startService源码分析
- android startService流程梳理笔记
- Service混合开启笔记(startService+bindService)
- android学习之Service的笔记,里面service里有监听用户通话状态的实例
- Android基础笔记(十六)- Service:startService()、stopService()、bindService()、unbindService()补充
- Android笔记-service启动过程分析:bindService源码分析、startService和bindService区别
- Android锁屏或灭屏状态下,高速按两次音量下键实现抓拍功能(1.2Framework层使用startService形式实现)
- Android菜鸟笔记-由startService到bindService的学习
- Android基础笔记(十六)- Service:startService()、stopService()、bindService()、unbindService()补充
- MT6735 - battery相关笔记 (充电、电池状态、zvc、driver与service通信)
- Android基础笔记(十六)- Service:startService()、stopService()、bindService()、unbindService()补充
- Android锁屏或灭屏状态下,快速按两次音量下键实现抓拍功能(1.2Framework层使用startService形式实现)
- android startService流程梳理笔记
- Android 面试题笔记-------bindservice与startservice的生命周期?
- Android锁屏或灭屏状态下,快速按两次音量下键实现抓拍功能(1.2Framework层使用startService形式实现)
- 一直处于Attempting to start Apache service...状态
- Service之onStartCommand()方法解析笔记