您的位置:首页 > 移动开发 > Android开发

Android 之IntentService学习

2013-05-13 18:06 204 查看
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采用单独的线程每次只从队列中拿出一个请求进行处理)

对这个还不懂,慢慢研究。

       
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: