2014-06-30 21:19:36|?次阅读|上传:wustguangh【已有?条评论】发表评论
关键词:Android, 移动应用|来源:唯设编程网
1、建立一个默认的工作线程执行所有的intent从onStartCommand()发来的,线程独立于你应用程序的主线程。
2、建立一个工作队列,一次传递一个intent给你的onHandleIntent()实现,这样你永远不用担心多线程。
3、停止service在所有的请求都处理完后,所以你永远不用调用stopSelf()。
4、提供默认的onBind()实现,即返回null的实现。
5、提供默认的onStartCommand()实现,发送intent给工作队列,然后发给你的onHandleIntent()实现。
所有这些加一起就是你所需要做的就是实现onHandleIntent()来完成你的工作。(虽然,你也需要提供一些构造函数为service)
下面是一个实现IntenService的例子:
这就是你所需要的:一个构造函数和一个onHandleIntent()的实现。
如果你也决定覆盖其它方法,例如onCreate()、onStartCommand()、或onDestroy(),保证调用父类实现,以便IntentService能合适的操作工作线程的生命期。
例如,onStartCommand()必须返回默认的实现(这决定intent怎样被送到onHandleIntent())
除了onHandleIntent()之外,惟一的方法你不需要调用的是onBind()(你只需要实现如果你的service允许绑定)。
就像你在前面看到的,使用IntentService让你的启动service变得非常简单。可是如果,你要求你的service实现多线程行为(不能使工作线程工作),那么你可以继承自Service类来操作这个intent。
为了比较,下面的示例代码是一个Service的实现类,和上面的例子实现一样的功能使用IntentService。就是主产,对一个请求,它使用一个线程来袴工作并且一次只处理一个。
<!-- 此处图略,可从SDK文档中查阅 -->
你会发现,有更多的工作和使用IntentService相比。
可是,因为你操作每一个调用onStartCommand()你自己,你可以同时处理多个请求。这不是这个例子做的事情,但是如果你需要的话,那么你可以建立一个线程为每一个请求并且立即运行它们(而不是等待前一个完成)。
注意onStartCommand()必须返回一个整数。这个整数是一个值,描述系统怎么继续service当系统杀死它的时候(就像上面讨论的,IntentService默认帮你实现,虽然你能改变它)。从onStartCommand返回的值必须是下面中的一个:
START_NOT_STICKY
如果系统杀死service在onStartCommand返回后,不要重新创建service,除非有等待的intent是发送。这是最安全的选项来避免运行你的service当不需要和当你的应用程序可以简单的重启任何未完成的工作。
START_STICKY
如果系统杀死service在onStartCommand()返回后,重新创建service并且调用onStartCommand(),但不重发送intent。相反,系统调用onStartCommand()用空intent,除非有等待的intent来启动service,在这种情况下,这些intents被传送。这适合中级选手(或相似服务)不在执行命令,但运行无期限和等待一个工作。
START_REDELIVER_INTENT
如果系统杀死service在onStartCommand()之后,重新创建service并且调用 用onStartComand()用最后一个intent,任何等待的intent都将被依次传递。这对一些service合适,它们常常活跃于处理一个工作应该被立即恢复,就像下载一个文件。
你可以开始一个service从一个activity或其它应用程序组件通过传递一个Intent给startService()。Android系统调用这个service的onStartCommand()方法并且传递它Intent。(你应该从不调用onStartCommand()直接)。
例如,一个activity能启动示例service在前一节的(helloservice)使用一个显式 的intent用startService();
startService()方法立即返回并且Android系统调用service的onStartCommand()方法。如果service没有运行,系统调用onCreate(),然后调用onStartCommand()。
如果service也没有提供绑定,用startService()发送的intent是惟一的通信方法在组件和服务。可是,如果你希望service发送一个结果回去,那么客户开始这个service能创建一个PendingIntent为一个广播并且传递它给service。然后Service能利用广播来传送结果。
一个启动的service必须管理它自己的生命周期。也就是,这个系统不stop或摧毁除非系统要恢复内存,并且service一直运行在onStartCommand()返回后。这样,service必须停止它自己通过stopSelf或另一个组件可以停止它通过stopService()。
一旦请求停止用stopSelf或stopService(),系统摧毁这个service尽快。
可是,如果你的service在onStartCommand操作多个请求同时,那么 你不应该停止service当你已经完成一个请求,因为你可以已经接收到一个新的请求(在第一个请求后停止可能会终止第二个)。为了避免这个问题,你可以使用stopSelf(int)来确保你的请求停止总是基于最近的请求。也就是,当你调用用stopSelf(int),你传递ID关于当前请求(ID传递给onStartCommand)。那么如果service收到一个新的request在你能够调用stopSelf(int)之前,那么这个ID将不会匹配并且service将不会停止 。
警告:你的应用程序停止它的服务当它完成工作这点非常重要,为了避免浪费系统资源并且消耗电池。如果需要,其它组件可以停止service通过stopService()。即使你能绑定这个service,你必须一直停止这个service你自己如果它收到一个onStartCommand()。