您的位置:首页 > 其它

笔记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()代码实现

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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐