深入剖析Android系统中Service和IntentService的区别

来源:爱站网时间:2019-10-17编辑:网友分享
android中的Service用于后台,当应用程序在后台挂起时,为了确保应用程序的组件仍然工作,今天爱站技术频道小编就带大家深入剖析Android系统中Service和IntentService的区别吧!

android中的Service用于后台,当应用程序在后台挂起时,为了确保应用程序的组件仍然工作,今天爱站技术频道小编就带大家深入剖析Android系统中Service和IntentService的区别吧!

那么我们当我们编写的耗时逻辑,不得不被service来管理的时候,就需要引入IntentService,IntentService是继承Service的,那么它包含了Service的全部特性,当然也包含service的生命周期,那么与service不同的是,IntentService在执行onCreate操作的时候,内部开了一个线程,去你执行你的耗时操作。

service本身存在两个问题:

(1)service不会专门启动一条单独的进程,service与它所在的应用位于同一个进程。

(2)service也不是专门新的一条线程,不应该在service中处理耗时的操作。

IntentService很好的弥补了这一点:

(1)IntentService会创建单独的worker线程来处理所有的intent请求。

(2)IntentService会创建单独的worker线程来处理onHandleIntent()方法实现的代码。

(3)当所有的请求处理完之后,IntentService会自动停止。

(4)为Service的OnBind()方法提供了默认的实现,返回null。

(5)为service的onStartCommand()方法提供了默认的实现,该实现会将请求intent添加到队列中。

所以对IntentService的使用就是:继承IntentService,重写onHandleIntent()方法即可。

tips:
(1)Intentservice也必须在manifest中声明。
(2)实现类的构造方法必须实现默认的构造方法。

这里我 需要解释以下几个方法,也许大家都已经很清楚了,不过为了抛砖引玉,我还是要提一嘴。

Service中提供了一个方法:

public int onStartCommand(Intent intent, int flags, int startId) { 
   onStart(intent, startId); 
   return mStartCompatibility ? START_STICKY_COMPATIBILITY : START_STICKY; 
 } 

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

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

protected abstract void onHandleIntent(Intent intent); 

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

子类的声明:

public class ChargeService extends IntentService  

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

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

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

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(Intent intent, int startId) { Message msg = mServiceHandler.obtainMessage(); msg.arg1 = startId; msg.obj = intent; mServiceHandler.sendMessage(msg); }

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

@Override 
    public void handleMessage(Message msg) { 
      onHandleIntent((Intent)msg.obj); 
      stopSelf(msg.arg1); 
    } 

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

以上就是深入剖析Android系统中Service和IntentService的区别,相信大家看了以后都应该清楚了,爱站技术频道小编会为大家带来更多更加专业的知识。

 

上一篇:详解Android中使用LoaderManager加载数据的方法

下一篇:详解Android中Intent传递对象给Activity的方法

您可能感兴趣的文章

相关阅读

热门软件源码

最新软件源码下载