您的位置:首页 > 其它

service与IntentService 区别

2015-04-07 00:53 253 查看
关系:

  IntentService继承service

区别:

  IntentService 是一个带有HandlerThread的线程的service,把任务执行完成以后IntentService自动销毁。

  Service要手动 调用stopSelf()来销毁。

  IntentService 运行在子线程中,Service运行在主线程中

作用:

   IntentService 用于执行一次复杂的场景使用IntentService相对好一点

  Service 用于重复执行的场景

代码分析:

  IntentService 运行在子线程中,Service运行在主线程中

  MyService 继承Service

package com.example.activitynate;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;

public class MyService extends Service {

@Override
public IBinder onBind(Intent intent) {
return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.println("MyService ===== 所在的线程   "+Thread.currentThread());
return super.onStartCommand(intent, flags, startId);
}
}


MyIntentService 继承IntentService

package com.example.activitynate;

import android.app.IntentService;
import android.content.Intent;

public class MyIntentService extends IntentService {

public MyIntentService(String name) {
super(name);

}
public MyIntentService() {
this("lihao");
}

@Override
protected void onHandleIntent(Intent intent) {
System.out.println("MyIntentService ===== 所在的线程   "+Thread.currentThread());
}

}


运行结果:

04-07 00:41:58.245: I/System.out(5107): MyService ===== 所在的线程 Thread[main,5,main]
04-07 00:41:58.255: I/System.out(5107): MyIntentService ===== 所在的线程 Thread[IntentService[lihao],5,main]

为什么MyIntentService 会在IntentService[lihao]这个线程中

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);
15             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;
}

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 + "]");
42         thread.start();
43
44         mServiceLooper = thread.getLooper();
45         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);
}

@Override
public int onStartCommand(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
public IBinder onBind(Intent intent) {
return null;
}

protected abstract void onHandleIntent(Intent intent);
}


从源代码的41-45行中 IntentService 中维护了一个HandlerThread 和一个Handler 很容易看到我们继承的IntentService的线程的名字

由于HandlerThread是个子线程start以后生成了loop传给Handler所以Handler运行在子线程里面然后,Handler发送消息,,接收到消息以后

会调用handleMessage()方法这个方法里面又调用了onHandleIntent(),这个方法执行完成后调用stopSelf() 13-14行代码,Service将自动销毁。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: