先喝杯咖啡放松一下!
概述
IntentService 使用
- Step 1: 定义IntentService类,重写onHandleIntent
- Step 2: 清单文件注册
- Step 3: 开启服务
Step 1
class SIntentService : IntentService("SIntentService") {
override fun onCreate() {
Log.e("SIntentService", "onCreate___")
super.onCreate()
}
override fun onStart(intent: Intent?, startId: Int) {
Log.e("SIntentService", "onStart___")
super.onStart(intent, startId)
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
Log.e("SIntentService", "onStartCommand___")
return super.onStartCommand(intent, flags, startId)
}
override fun onHandleIntent(intent: Intent?) {
Log.e("SIntentService", "onHandleIntent___"+intent?.getExtras()?.getString("task"))
// 根据 Intent的不同,进行不同的事务处理
val string = intent?.getExtras()?.getString("task")
when (string) {
"task_1" -> Log.e("SIntentService", "task_1______");
"task_2" -> Log.e("SIntentService", "task_2______");
}
}
override fun onDestroy() {
Log.e("SIntentService", "onDestroy___")
super.onDestroy()
}
}
Step 2
<service android:name=".SIntentService"></service>
Step 3
var i = Intent(mCtx, SIntentService::class.java);
var bundle = Bundle();
bundle.putString("task", "task_1");
i.putExtras(bundle);
startService(i)
var i2 = Intent(mCtx, SIntentService::class.java);
var bundle2 = Bundle();
bundle2.putString("task", "task_2");
i2.putExtras(bundle2);
startService(i2)
Log日志:
通过Log可以看出,多次开启starService(),任务会被onStartCommand()插入工作队列,任务按顺序执行完毕,Service会自动销毁。
源码分析
源码思维导图:
思维导图里,已经画好了,IntentService对应的函数里做了哪些工作。
有关HandlerThread详情可参考:多线程:HandlerThread+思维导图
具体分析
- onCreate() 源码
主要作用: 初始化一个Thread和Handler
@Override
public void onCreate() {
super.onCreate();
// step 1 开启一个Thread实例(HandlerThread是继承Thread的)
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
thread.start();
// step 2 通过Thread获取当前的Looper对象
mServiceLooper = thread.getLooper();
// step 3 Lopper与Handler绑定(ServiceHandler继承 Handler)
mServiceHandler = new ServiceHandler(mServiceLooper);
}
- onStartCommand 源码
主要作用:将Intent插入工作队列
@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
// 将Intent传入onStart (多次开启时,就是这里将Intent插入队列的)
onStart(intent, startId);
return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
}
- onStart 源码
主要作用:将Intent发送给Handler,交由handleMessage去处理
@Override
public void onStart(@Nullable Intent intent, int startId) {
//step 1 获取Message对象
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
msg.obj = intent;
// step 2 利用在onCreate()函数里,初始化的Handler对象,发送消息,
// Intent交由handleMessage处理
mServiceHandler.sendMessage(msg);
}
ServiceHandler
private final class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
//step 1 将Intent请求,下发至onHandleIntent,用客户端去处理
onHandleIntent((Intent)msg.obj);
// step 2 停止服务
stopSelf(msg.arg1);
}
}
- onHandleIntent 源码
主要作用:需要重写,处理对应的Intent请求
@WorkerThread
protected abstract void onHandleIntent(@Nullable Intent intent);
- onDestroy 源码
主要作用:退出消息队列
@Override
public void onDestroy() {
mServiceLooper.quit();
}
整个IntentService源码分析到这里级结束了,如有什么不正确的,请指出!
如果对看官有所帮助,请麻烦手指点个赞吧!Thanks
点不点!