异步服务IntentService
Posted 天耀106
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了异步服务IntentService相关的知识,希望对你有一定的参考价值。
服务Service虽然是在后台运行,但跟Activity一样都在主线程中,如果后台运行着的服务挂起,用户界面就会卡着不动,俗称死机。后台服务经常要做一些耗时操作,比如批量处理、文件导入、网络访问等,此时不应该影响用户在界面上的操作,而应该开启分线程执行耗时操作。可以通过Thread+Handler机制实现异步处理,也可以通过android封装好的异步服务IntentService处理。
使用IntentService有两个好处,一个是免去复杂的消息通信流程;另一个是处理完成后无须手工停止服务,开发者可集中精力进行业务逻辑的编码。话虽如此,我们还是有必要了解一下IntentService的具体实现,入了这行一般都要干上许多年,晚学不如早学。处理器对象位于主线程中,分线程通过Handler对象通知主线程,然后主线程执行Handler对象的handleMessage方法刷新界面。反过来也是允许的,即处理器对象位于分线程中,主线程通过handler对象通知分线程,然后分线程执行Handler对象的handleMessage方法进行耗时处理。
1、创建异步服务时,初始化分线程的Handler对象,注意下面源码的thread.getLooper方法:
@Override
public void onCreate()
super.onCreate();
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
thread.start();
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
2、异步服务开始运行时,通过Handler对象将请求数据送给分线程,源码如下:
@Override
public void onStart(@Nullable Intent intent, int startId)
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
mServiceHandler.sendMessage(msg);
3、分线程在Handler对象的handleMessage方法中,先通过onHandleIntent方法执行具体的事务处理,再调用stopSelf结束指定标识的服务。源码如下:
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);
了解IntentService的实现思想后,使用过程中需要注意以下4点:
(1)增加一个构造方法,并分配内部线程的唯一名称。
(2)onStartCommand方法要调用父类的onStartCommand,因为父类方法会向分线程传递消息。
(3)耗时处理的业务代码要写在onHandleIntent方法中,不可写在onStartCommand方法中。因为onHandleIntent方法位于分线程,而onStartCommand方法位于主线程。
(4)IntentService实现了onStart方法,却未实现onBind方法,意味着异步服务只能用普通方式启停,不能用绑定方式启停。
以上是关于异步服务IntentService的主要内容,如果未能解决你的问题,请参考以下文章
如何在固定时间间隔后使用 IntentService 实现进行轮询?