android IntentService实现原理及内部代码分享
程序员文章站
2023-11-12 10:08:46
很多网友可能发现android中除了service还有一个intentservice,他们之间到底有哪些区别呢? 在继承关系上而言in...
很多网友可能发现android中除了service还有一个intentservice,他们之间到底有哪些区别呢? 在继承关系上而言intentservice是service的子类,内部实现的代码中涉及到一些android入门开发者不了解的looper,android123在早期的文章中已经说明他们的用法,这里不再赘述,有关原理大家可以看源码实现如下:
public abstract class intentservice extends service {
private volatile looper mservicelooper;
private volatile servicehandler mservicehandler; //一个handler封装了looper对象
private string mname;
private boolean mredelivery;
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);
}
}
public intentservice(string name) { //构造方法,需要提供一个name作为标识
super();
mname = name;
}
对于下面的setintentredelivery的参数,如果为真时
onstartcommand(intent, int, int)} will return
service#start_redeliver_intent}, so if this process dies before
onhandleintent(intent)} returns, the process will be restarted
如果为假时
onstartcommand(intent, int, int)} will return
service#start_not_sticky}, and if the process dies
public void setintentredelivery(boolean enabled) {
mredelivery = enabled;
}
@override
public void oncreate() { //这里重写父类service的创建,主要是构造一个线程
super.oncreate();
handlerthread thread = new handlerthread("intentservice[" + mname + "]");
thread.start();
mservicelooper = thread.getlooper();
mservicehandler = new servicehandler(mservicelooper);
}
@override
public void onstart(intent intent, int startid) { //android 2.0以前的service启动参数控制
message msg = mservicehandler.obtainmessage();
msg.arg1 = startid;
msg.obj = intent;
mservicehandler.sendmessage(msg);
}
@override
public int onstartcommand(intent intent, int flags, int startid) { //android 2.0以后的服务启动参数
onstart(intent, startid);
return mredelivery ? start_redeliver_intent : start_not_sticky;
}
@override
public void ondestroy() { //服务摧毁的时候looper一定要释放掉,这点很重要。
mservicelooper.quit();
}
@override
public ibinder onbind(intent intent) {
return null;
}
protected abstract void onhandleintent(intent intent);
}
从上面的代码相信大家可以看出intentservice和service的不同了,通过looper和thread来解决标准service中处理逻辑的阻塞问题,毕竟android的service也是会阻塞的。
复制代码 代码如下:
public abstract class intentservice extends service {
private volatile looper mservicelooper;
private volatile servicehandler mservicehandler; //一个handler封装了looper对象
private string mname;
private boolean mredelivery;
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);
}
}
public intentservice(string name) { //构造方法,需要提供一个name作为标识
super();
mname = name;
}
对于下面的setintentredelivery的参数,如果为真时
复制代码 代码如下:
onstartcommand(intent, int, int)} will return
service#start_redeliver_intent}, so if this process dies before
onhandleintent(intent)} returns, the process will be restarted
如果为假时
复制代码 代码如下:
onstartcommand(intent, int, int)} will return
service#start_not_sticky}, and if the process dies
public void setintentredelivery(boolean enabled) {
mredelivery = enabled;
}
@override
public void oncreate() { //这里重写父类service的创建,主要是构造一个线程
super.oncreate();
handlerthread thread = new handlerthread("intentservice[" + mname + "]");
thread.start();
mservicelooper = thread.getlooper();
mservicehandler = new servicehandler(mservicelooper);
}
@override
public void onstart(intent intent, int startid) { //android 2.0以前的service启动参数控制
message msg = mservicehandler.obtainmessage();
msg.arg1 = startid;
msg.obj = intent;
mservicehandler.sendmessage(msg);
}
@override
public int onstartcommand(intent intent, int flags, int startid) { //android 2.0以后的服务启动参数
onstart(intent, startid);
return mredelivery ? start_redeliver_intent : start_not_sticky;
}
@override
public void ondestroy() { //服务摧毁的时候looper一定要释放掉,这点很重要。
mservicelooper.quit();
}
@override
public ibinder onbind(intent intent) {
return null;
}
protected abstract void onhandleintent(intent intent);
}
从上面的代码相信大家可以看出intentservice和service的不同了,通过looper和thread来解决标准service中处理逻辑的阻塞问题,毕竟android的service也是会阻塞的。