Service的简介:
1:什么是service:
service是后台服务
2:service的作用:
为了保证应用程序被挂到后台后某些组件仍然可以工作
3:service的弊端:
service既不是独立的进程也不是独立的线程,是依赖于主线程的,所以是不建议在service里面做过多的耗时操作的,避免ANR。
IntentService的简介:
1.什么是intentService:
intentService是Service的子类,继承service,拥有service的全部生命周期,包含了service的全部特性;
2.intentService的作用:
在onCreat被执行时内部会开启一个线程,用于解决在后台服务中进行耗时操作;
例如:后台上传图片,批量操作数据库等;
IntentService使用方法:
源码解读
packagecom.shaomin.wsm.intentservice
importandroid.app.Service;
importandroid.content.Intent;
importandroid.os.Handler;
importandroid.os.HandlerThread;
importandroid.os.IBinder;
importandroid.os.Looper;
importandroid.os.Message;
publicabstractclassIntentServiceextendsService{
privatevolatileLoopermServiceLooper;//消息队列
privatevolatileServiceHandlermServiceHandler;
privateStringmName;
privatebooleanmRedelivery;
//构造方法 传入我们创建的Intentservice的名字
publicIntentService(Stringname){
super();
mName=name;
}
//创建一个服务并开启线程得到消息队列并通过handller发送
@Override
publicvoidonCreate(){
super.onCreate();
//创建一个线程对象
HandlerThreadthread=newHandlerThread("IntentService["+mName+"]");
//开启线程
thread.start();
//创建队列,获得Looper对象
mServiceLooper=thread.getLooper();
//创建线程对象
mServiceHandler=newServiceHandler(mServiceLooper);
}
//由onStartCommand中回调onstart通过mServiceHandler发送消息到该handler的handleMessage中去。
//最后handleMessage中回调onHandleIntent(intent)。
@Override
publicvoidonStart(Intentintent,intstartId){
//获得消息对象
Messagemsg=mServiceHandler.obtainMessage();
msg.arg1=startId;
msg.obj=intent;
//发送消息
mServiceHandler.sendMessage(msg);
}
//设置该方法的布尔值(具体用途在onStartCommand中体现)
publicvoidsetIntentRedelivery(booleanenabled){
mRedelivery=enabled;
}
//mRedelivery会根据setIntentRedelivery设置的布尔值返回START_REDELIVER_INTENT or START_NOT_STICKY
//START_NOT_STICKY型服务会直接被关闭
//START_REDELIVER_INTENT 型服务会在可用资源不再吃紧的时候尝试再次启动服务
//当我们的操作不是十分重要的时候,我们可以选择START_NOT_STICKY,这也是IntentService的默认选项
//当我们认为操作十分重要时,则应该选择START_REDELIVER_INTENT 型服务
@Override
publicintonStartCommand(Intentintent,intflags,intstartId){
onStart(intent,startId);
returnmRedelivery?START_REDELIVER_INTENT:START_NOT_STICKY;
}
@Override
publicIBinderonBind(Intentintent){
returnnull;
}
//退出消息队列
@Override
publicvoidonDestroy(){
mServiceLooper.quit();
}
privatefinalclassServiceHandlerextendsHandler{
publicServiceHandler(Looperlooper){
super(looper);
}
//接收handler发送的消息 消息值为int型相当于一个请求的唯一标识。每发送一个请求,会生成一个唯一的标识,然后将请求放入队列,当全部执行完成(最后一个请求也就相当于getLastStartId == startId),
// 或者当前发送的标识是最近发出的那一个(getLastStartId == startId),则会销毁我们的Service.
@Override
publicvoidhandleMessage(Messagemsg){
onHandleIntent((Intent)msg.obj);
/**
* Message 可以传递的参数有:
1. arg1 arg2 整数类型,是setData的低成本替代品。传递简单类型
2. Object 类型 obj
3. what 用户自定义的消息代码,这样接受者可以了解这个消息的信息。每个handler各自包含自己的消息代码,所以不用担心自定义的消息跟其他handlers有冲突。
*/
stopSelf(msg.arg1);
}
}
//重写耗时操作的逻辑,改方法会延伸到继承它的子类中实现
protectedabstractvoidonHandleIntent(Intentintent);
}
IntentService具体方法解读
构造函数
IntentService(String name)创建一个 IntentService.
公用方法
onBind(Intent intent)不需要实现此方法,因为默认实现返回null
onCreate()当服务首次创建时由系统调用。
onDestroy()通知服务不再使用并正在被删除
onStartCommand不需要重写
setIntentRedelivery(boolean enabled) 源码中的体现是根据此方法设置的布尔值来决定onStartCommand 返回START_NOT_STICKY还是START_REDELIVER_INTENT;;;START_NOT_STICKY型服务会直接被关闭,而START_REDELIVER_INTENT 型服务会在可用资源不再吃紧的时候尝试再次启动服务。 由此我们可以发现,当我们的操作不是十分重要的时候,我们可以选择START_NOT_STICKY,这也是IntentService的默认选项,当我们认为操作十分重要时,则应该选择START_REDELIVER_INTENT 型服务
onHandleIntent(Intent intent)该函数用于针对Intent的不同进行不同的事务处理就可以了.执行完所一个Intent请求对象所对应的工作之后,如果没有新的Intent请求达到,则自动停止Service;否则ServiceHandler会取得下一个Intent请求传人该函数来处理其所对应的任务。
网友评论