android IntentService实现原理及内部代码分享

504921789

504921789

2016-02-19 09:37

下面是个简单易学的android IntentService实现原理及内部代码分享教程,图老师小编详细图解介绍包你轻松学会,喜欢的朋友赶紧get起来吧!
    很多网友可能发现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也是会阻塞的。
展开更多 50%)
分享

猜你喜欢

android IntentService实现原理及内部代码分享

编程语言 网络编程
android IntentService实现原理及内部代码分享

Android基站定位原理及实现代码

编程语言 网络编程
Android基站定位原理及实现代码

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

android书架效果实现原理与代码

编程语言 网络编程
android书架效果实现原理与代码

android Setting中隐藏项实现原理与代码

编程语言 网络编程
android Setting中隐藏项实现原理与代码

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Android在listview添加checkbox实现原理与代码

编程语言 网络编程
Android在listview添加checkbox实现原理与代码

JavaScript如何控制Session实现原理及代码

Web开发
JavaScript如何控制Session实现原理及代码

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

ASP中通过该日历算法实现的具体代码

ASP中通过该日历算法实现的具体代码

如何对量产好的U盘进行复制

如何对量产好的U盘进行复制
下拉加载更多内容 ↓