Service和IntentService

2019-06-04  本文已影响0人  崽子猪

Android的Service是用于后台服务的,当应用程序被挂到后台的时候,问了保证应用某些组件仍然可以工作而引入了Service这个概念,

那么这里要强调的是Service不是独立进程,也不是独立的线程,它是依赖于应用程序的主线程的.也就是说,更多的时候不建议在Service中编写耗时操作的逻辑和操作,否则会引起ANR.

那么当我们编写的耗时操作,不得不被Service来管理的时候,就需要引入IntentService,IntentService是继承Service的.

IntentService包含了Service的全部特性,当然也包含Service的生命周期,那么Service不同的是IntentService在执行onCreate操作的时候,内部开了一个线程,去执行你的耗时操作.


这里我 需要解释以下几个方法,也许大家都已经很清楚了

Service中提供了一个方法

publicint onStartCommand(Intent intent,int flags,int startId) {  

                 onStart(intent, startId);  

                 return mStartCompatibility ? START_STICKY_COMPATIBILITY : START_STICKY;  

 }  

这个方法的具体含义是,当你的需要这个service启动的时候,或者调用这个servcie的时候,那么这个方法首先是要被回调的。

同时IntentService中提供了这么一个方法:

protected abstractvoid onHandleIntent(Intent intent);  

这是一个抽象方法,也就是说具体的实现需要被延伸到子类.

子类的声明:

public class ChargeServiceextends IntentService   

上面提到过IntentService是继承Service的,那么这个子类也肯定继承service,那么onHandleIntent()方法是什么时候被调用的呢?让我们具体看IntentService的内部实现:

privatefinalclass ServiceHandlerextends Handler {  

public ServiceHandler(Looper looper) {  

super(looper);  

    }  

@Override  

publicvoid 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. 

 */  

publicvoid setIntentRedelivery(boolean enabled) {  

    mRedelivery = enabled;  

}  

@Override  

publicvoid 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  

publicvoid onStart(Intent intent,int startId) {  

    Message msg = mServiceHandler.obtainMessage();  

    msg.arg1 = startId;  

    msg.obj = intent;  

    mServiceHandler.sendMessage(msg);  

}  

在这里我们可以清楚的看到其实IntentService在执行onCreate的方法的时候,其实开了一个线程HandlerThread,并获得了当前线程队列管理的looper,并且在onStart的时候,把消息置入了消息队列.

@Override  

publicvoid handleMessage(Message msg) {  

           onHandleIntent((Intent)msg.obj);  

           stopSelf(msg.arg1);  

  }  

在消息被handler接受并且回调的时候,执行了onHandlerIntent方法,该方法的实现是子类去做的.

结论

IntentService是通过Handler looper message的方式实现了一个多线程的操作,同时耗时操作也可以被这个线程管理和执行,同时不会产生ANR的情况.

上一篇 下一篇

猜你喜欢

热点阅读