0、目录
一、简介
二、Service介绍
三、使用步骤
四、使用实例
五、源码分析
六、IntentService与service的区别
七、总结
一、简介
二、Service介绍
生命周期:
首次启动服务时,
调用startService()方法开启服务后,服务的执行过程:onCreat()-->onStartCommand()-->onDestroy();
调用bindService()方法开启服务后,服务的执行过程:onCreat()-->onBind()-->onUnbind()-->onDestroy()
若服务已经启动,再次调用startService()方法启动服务时,则不会再次调用onCreat()方法,而是直接执行onStartCommand()方法;再次调用bindService()方法启动服务时,如果没有绑定,则执行onBind()方法,如果已经绑定,则啥都不执行。
停止服务时,如用startService()开启的服务,则用stopServic()方法停止服务;如用bindService()开启的服务,则用unbindService()方法停止服务。
三、使用步骤
步骤一、创建子类,继承IntentService,并根据需要复写onCreat()、onStartCommand()、onHandleIntent()(必须实现)、onDestroy()
步骤二、在Manifest.xml中注册服务
步骤 三、在Activity中开启服务
四、使用实例
步骤 一、继承IntentService,创建子类,并根据需要实现onCreat()、onStartCommand()、onHandleIntent()(必须实现)、onDestroy()。
//步骤 一、继承IntentService,创建子类,并根据需要实现onCreat()、onStartCommand()、onHandleIntent()(必须实现)、onDestroy()。
package com.example.IntentServiceDemo;
import android.app.IntentService;
import android.content.Intent;
public class MyIntentService extends IntentService {
//构造器
public MyIntentService() {
//参数为工作线程的名字
super("MyIntentService");
}
//首次创建服务时调用,如已经创建服务,再次启动服务则不会被调用
//运行于UI线程
@Override
public void onCreate() {
super.onCreate();
System.out.println(Thread.currentThread().getName() + ":" + "onCreate");
}
//每次创建服务时都会被调用
//运行于UI线程
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.println(Thread.currentThread().getName() + ":" + "onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
//在onStartCommand()中被调用
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
System.out.println(Thread.currentThread().getName() + ":" + "onStart");
}
//执行耗时任务的地方,必须复写
//工作线程
@Override
protected void onHandleIntent(Intent intent) {
//根据Intent做相关的处理
String s = intent.getStringExtra("name");
if (s.equalsIgnoreCase("myIntent")) {
try {
Thread.sleep(3000);
System.out.println(Thread.currentThread().getName() + ":" + "onHandleIntent sleep 3s");
} catch (Exception e) {
}
}
}
//销毁服务
@Override
public void onDestroy() {
super.onDestroy();
System.out.println(Thread.currentThread().getName() + ":" + "onDestroy");
}
}
步骤二、在Manifest.xml中注册服务
service android:name="com.example.IntentServiceDemo.MyIntentService">
<intent-filter >
<action android:name="haovin"/>
</intent-filter>
</service>
步骤三、在Activity中启动服务
Intent intent = new Intent("haovin");
intent.putExtra("name", "myIntent");
intent.setPackage(getPackageName());
for (int i = 0; i < 3; i++) {
startService(intent);
}
执行结果如下:
五、源码分析
1、onCreate()源码:
//Called by the system when the service is first created. Do not call this method directly.
@Override
public void onCreate() {
super.onCreate();
//创建一个HandlerThread类型的工作线程thread
HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
//启动线程
thread.start();
//获取与该线程绑定的Looper
mServiceLooper = thread.getLooper();
//创建一个Handler,并绑定到工作线程thread -->分析1
mServiceHandler = new ServiceHandler(mServiceLooper);
}
分析1:ServiceHandler
private final class ServiceHandler extends Handler {
//构造方法
public ServiceHandler(Looper looper) {
super(looper);
}
//复写handleMessage()方法
@Override
public void handleMessage(Message msg) {
//已经在工作线程中执行
//调用自己复写的onHandleIntent()方法,执行耗时任务
onHandleIntent((Intent)msg.obj);
stopSelf(msg.arg1);
}
}
2、onStartCommand()源码
@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
//调用onStart()方法 ,详见onStart()源码
onStart(intent, startId);
return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
}
3、onStart()源码
@Override
public void onStart(@Nullable Intent intent, int startId) {
//获取一个消息对象
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
//把Intent参数包装到消息对象的obj属性中
//此处的intent,就是在Activity中调用startService(Intent intent)方法出入进来的
msg.obj = intent;
//把消息添加到与mServiceHandler绑定的消息队列处理
mServiceHandler.sendMessage(msg);
}
4、onDestroy()源码
//服务结束时调用该方法
@Override
public void onDestroy() {
mServiceLooper.quit();
}
总结:
1、IntentService是Service的子类,内部实现了Handler+HandlerThread
2、在onCreat()方法内创建了一个HandlerThread工作线程,并创建了与该工作线程绑定的Handler
3、通过onStartCommand()方法传递启动服务时的Intent到Handler,放入消息队列,并从消息队列取出处理,处理完成后,再取出下一个消息进行处理,根据入队列的顺序依次执行。
六、IntentService与service的区别
七、总结
以上就是IntentService所有总结,包括使用方法和源码分析等,欢迎一起讨论。