IntentService
- IntentService是继承于Service并处理异步任务的一个类
- 在 IntentService 内有一个工作线程来处理耗时操作
- 当任务执行完后,IntentService 会自动停止,不需要我们去手动结束
- 当启动 IntentService 多次,那么每一个耗时操作会以工作队列的方式逐一进行
- 当执行onHandleIntent耗时操作后,此Service会自动停止
IntentService使用步骤
- 新建类继承IntentService
- 实现父类的构造方法
- 重写onHandleIntent方法(耗时操作)
- 重写onCreate方法
- 重写onDestory方法
- 在AndroidManifest中注册Service
- 在有Context环境中通过IntentService启动Service
onHandleIntent方法
1、需要执行的耗时操作放在此方法中执行
2、此方法会新开线程,不会在主线程中执行
IntentService使用实例
IntentService代码,打印计数
public class MyIntentService extends IntentService {
public MyIntentService(String name) {
super(name);
}
public MyIntentService(){
super("");
}
//在onHandleIntent执行耗时操作,输出十以内的属
@Override
protected void onHandleIntent(@Nullable Intent intent) {
for(int i=0;i<10;i++){
try {
Log.e("onHandleIntent: ",i+"+++++++++++++++++++++++" );
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Activity代码
public class ServiceActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn1;
private Button btn2;
private Button btn3;
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
System.out.println("onDisConnected");
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
System.out.println("connected");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_service);
btn1 = findViewById(R.id.service_btn1);
btn2 = findViewById(R.id.service_btn2);
btn3 = findViewById(R.id.service_btn3);
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
btn3.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.service_btn1:
//跳转到Service启动Service
Intent intent=new Intent(this,MyIntentService.class);
startService(intent);
break;
case R.id.service_btn2:
unbindService(conn);
break;
case R.id.service_btn3:
Intent intent1=new Intent(ServiceActivity.this,Service2Activity.class);
startActivity(intent1);
break;
}
}
}
打印如下:
IntentService总结:
- 会创建独立的工作线程来处理所有的Intent请求
- 会创建独立的工作线程来处理onHandleIntent()方法实现的代码,无需处理多线程问题
- 多次调用时,按队列的顺序逐一执行,每次执行都是从创建到销毁的全部过程
优点:
1、无需处理线程的创建与线程同步问题
2、无需手动关闭Service缺点:
无法精确控制线程执行过程,一旦线程启动后只能等待线程执行完毕
IntentService与Service区别
- IntentService是继承自Service;
- Service不是一个单独的进程,它和应用程序在同一个进程中;
- Service也不是一个线程,所以我们要避免在Service中进行耗时的操作;
- IntentService使用队列的方式将请求的Intent加入队列,然后开启了一个Worker Thread(工作线程)在处理队列中的Intent,对于异步的startService请求,
IntentService会处理完成一个之后在处理第二个,每一个请求都会在一个单独的Worker Thread中处理,不会阻塞应用程序的主线程。
因此,如果我们如果要在Service里面处理一个耗时的操作,我们可以用IntentService来代替使用。- 使用IntentService 必须首先继承IntentService并实现onHandleIntent()方法,将耗时的任务放在这个方法执行,其他方面,IntentService和Service一样。