现在的位置: 首页 > 综合 > 正文

Android 之IntentService学习

2013年05月16日 ⁄ 综合 ⁄ 共 2099字 ⁄ 字号 评论关闭

public abstract class IntentService extends Service
1.IntentService的启动与结束
既然它继承自Service,那么先来考虑Service的启动和结束。启动Service有两种方式:startService()和bindService()。
对于IntentService应该采用startService方法来启动,理论上也可以用bindService启动,实际是否可行还需要验证。
我们知道startService方法启动的Service,必须调用stopService才能结束,或者Service自己自杀(stopSelf()),当通过startService方法启动IntentService后,我们不需要再通过stopService结束它,它工作结束后就会自杀,这可以在代码中看到:

private final class ServiceHandler extends Handler {
    public ServiceHandler(Looper looper) {
        super(looper);
    }

    @Override
    public void handleMessage(Message msg) {
        onHandleIntent((Intent)msg.obj);
        stopSelf(msg.arg1); //处理完消息后,此Service就会结束自己的生命
    }
}

2.继承自IntentService
作为一个抽象类,它只有一个抽象方法需要我们实现:protected abstract void onHandleIntent(Intent intent);
不同于Service,我们不需要实现onBind方法,因为IntentService已经实现了:
public IBinder onBind(Intent intent) {
    return null;
}

3.开启新线程异步处理问题

public void onCreate() {
    // TODO: It would be nice to have an option to hold a partial wakelock
    // during processing, and to have a static startService(Context, Intent)
    // method that would launch the service & hand off a wakelock.

    super.onCreate();
    HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
    thread.start();

    mServiceLooper = thread.getLooper();
    mServiceHandler = new ServiceHandler(mServiceLooper);
}

这是个典型的利用Handler机制实现异步处理问题的方式:新建一个ServiceHandler继承自Handler,为了能够实现异步处理,需要借助于HandlerThread来另起一个线程来获得那个线程的Looper传递给ServiceHandler。

4.IntentService的作用

public void onStart(Intent intent, int startId) {
    Message msg = mServiceHandler.obtainMessage();
    msg.arg1 = startId;
    msg.obj = intent;
    mServiceHandler.sendMessage(msg);
}

我们使用IntentService,就是要它在后台并异步地来处理我们的问题,我们的问题信息都在Intent中,而IntentService会把这个Intent封装成一个消息,并发送到ServiceHandler对应的Looper的消息队列中,然后通过handleMessage把这个任务交给onHandleIntent来处理,处理完后就结束IntentService。

小结:IntentService能够在后台异步地来处理我们的问题,而Service并不能异步处理问题(除非自己创建另一个线程来处理),它的使用非常方便:把要做的任务信息放在Intent中,然后startService启动就ok了,至于如何完成这个任务,当然要写个类继承IntentService,最关键的是复写onHandleIntent方法。

疑问:http://blog.csdn.net/zhf198909/article/details/6906786
startService(new Intent(this,MyIntentService.class));  
startService(new Intent(this,MyIntentService.class));
//连续两次启动IntentService,会发现应用程序不会阻塞,而且最重的是第二次的请求会再第一个请求结束之后运行(这个证实了IntentService采用单独的线程每次只从队列中拿出一个请求进行处理)
对这个还不懂,慢慢研究。
       

抱歉!评论已关闭.