面试之--IntentService
来源:互联网 发布:中世纪2优化9威尼斯 编辑:程序博客网 时间:2024/05/23 01:41
面试中经常会问的IntentService和Service的区别?相信用过的人都会知道IntentService是Service的子类,子类一般比父类牛逼,那么IntentService牛逼在何处?
IntentService开启了一个工作线程来处理耗时操作,这样就不需要我们自己创建线程执行耗时操作,从而更好的完成我们的核心代码。那IntentService是在自己内部开启工作线程的呢?看一下源码我们就知道了。
public abstract class IntentService extends Service { private volatile Looper mServiceLooper; private volatile ServiceHandler mServiceHandler; 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); } } /** * Creates an IntentService. Invoked by your subclass's constructor. * * @param name Used to name the worker thread, important only for debugging. */ public IntentService(String name) { super(); mName = name; } /** * Sets intent redelivery preferences. Usually called from the constructor * with your preferred semantics. * * <p>If enabled is true, * {@link #onStartCommand(Intent, int, int)} will return * {@link Service#START_REDELIVER_INTENT}, so if this process dies before * {@link #onHandleIntent(Intent)} returns, the process will be restarted * and the intent redelivered. If multiple Intents have been sent, only * the most recent one is guaranteed to be redelivered. * * <p>If enabled is false (the default), * {@link #onStartCommand(Intent, int, int)} will return * {@link Service#START_NOT_STICKY}, and if the process dies, the Intent * dies along with it. */ public void setIntentRedelivery(boolean enabled) { mRedelivery = enabled; } @Override 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); } @Override public void onStart(@Nullable Intent intent, int startId) { Message msg = mServiceHandler.obtainMessage(); msg.arg1 = startId; msg.obj = intent; mServiceHandler.sendMessage(msg); } /** * You should not override this method for your IntentService. Instead, * override {@link #onHandleIntent}, which the system calls when the IntentService * receives a start request. * @see android.app.Service#onStartCommand */ @Override public int onStartCommand(@Nullable Intent intent, int flags, int startId) { onStart(intent, startId); return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY; } @Override public void onDestroy() { mServiceLooper.quit(); } /** * Unless you provide binding for your service, you don't need to implement this * method, because the default implementation returns null. * @see android.app.Service#onBind */ @Override @Nullable public IBinder onBind(Intent intent) { return null; } /** * This method is invoked on the worker thread with a request to process. * Only one Intent is processed at a time, but the processing happens on a * worker thread that runs independently from other application logic. * So, if this code takes a long time, it will hold up other requests to * the same IntentService, but it will not hold up anything else. * When all requests have been handled, the IntentService stops itself, * so you should not call {@link #stopSelf}. * * @param intent The value passed to {@link * android.content.Context#startService(Intent)}. * This may be null if the service is being restarted after * its process has gone away; see * {@link android.app.Service#onStartCommand} * for details. */ @WorkerThread protected abstract void onHandleIntent(@Nullable Intent intent);}
在onCreate()方法里面new了一个HandlerThread,并且得到了一个Looper;我们知道我们的主线程中默认会有一个looper的,而且我们知道如果在子线程中有looper,并且调用Looper.prepare()和Looper.loop(),我们的子线程也可以进行耗时操作了。那么我们看一下HandlerThread是什么。
public class HandlerThread extends Thread { int mPriority; int mTid = -1; Looper mLooper; public HandlerThread(String name) { super(name); mPriority = Process.THREAD_PRIORITY_DEFAULT; } public HandlerThread(String name, int priority) { super(name); mPriority = priority; } protected void onLooperPrepared() { } @Override public void run() { mTid = Process.myTid(); Looper.prepare(); synchronized (this) { mLooper = Looper.myLooper(); notifyAll(); } Process.setThreadPriority(mPriority); onLooperPrepared(); Looper.loop(); mTid = -1; } public Looper getLooper() { if (!isAlive()) { return null; } synchronized (this) { while (isAlive() && mLooper == null) { try { wait(); } catch (InterruptedException e) { } } } return mLooper; } public boolean quit() { Looper looper = getLooper(); if (looper != null) { looper.quit(); return true; } return false; } public boolean quitSafely() { Looper looper = getLooper(); if (looper != null) { looper.quitSafely(); return true; } return false; } public int getThreadId() { return mTid; }}
HandlerThread其实是Thread的子类,并且在run()方法里面调用了Looper.prepare()和Looper.loop()。而且还提供了一个方法将looper返回,以便于我们用在Handler中。
正是有了以上的操作我们IntentService才可以进行耗时操作。具体的Handler,Looper等这些源码我们自己去看一下分析一下,还是比较复杂的。
详细请看鸿洋大神的这篇文章: Android IntentService完全解析 当Service遇到Handler
阅读全文
0 0
- 面试之--IntentService
- 面试之- IntentService的应用
- 全面升级Android面试之IntentService面试题集
- Android面试篇之Service和IntentService的区别
- IntentService面试知识点
- Service IntentService区别 (面试)
- Android之IntentService
- android之IntentService
- Android 之IntentService学习
- android之intentservice
- Android开发之IntentService
- Android之IntentService
- android之IntentService
- Android学习之IntentService
- Android之IntentService
- IntentService之我见
- Android之IntentService使用
- Android多线程之IntentService
- MyCollector02---AppManager
- 压缩,解压工具
- 怎么成为一个开心的程序猿
- JavaEE笔记索引
- 机器学习-学习笔记 学习总结归纳(第十四周)
- 面试之--IntentService
- 获取子页面数据
- 【NOTE】python3.6下scons运行提示找不到SCons.Script解决方式
- 服务器端测试经验分享
- XILINX SDK怎么设置头文件(源文件)路径
- HTTP请求方法之header(原来不光只有post和get啊~~)
- windows版本区别
- ZooKeeper的介绍及集群的安装与配置
- Https单向认证和双向认证