Android——IntentService

IntentService

  1. IntentService是继承于Service并处理异步任务的一个类
  2. 在 IntentService 内有一个工作线程来处理耗时操作
  3. 当任务执行完后,IntentService 会自动停止,不需要我们去手动结束
  4. 当启动 IntentService 多次,那么每一个耗时操作会以工作队列的方式逐一进行
  5. 当执行onHandleIntent耗时操作后,此Service会自动停止

IntentService使用步骤

  1. 新建类继承IntentService
  2. 实现父类的构造方法
  3. 重写onHandleIntent方法(耗时操作)
  4. 重写onCreate方法
  5. 重写onDestory方法
  6. 在AndroidManifest中注册Service
  7. 在有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总结:

  1. 会创建独立的工作线程来处理所有的Intent请求
  2. 会创建独立的工作线程来处理onHandleIntent()方法实现的代码,无需处理多线程问题
  3. 多次调用时,按队列的顺序逐一执行,每次执行都是从创建到销毁的全部过程

优点:
1、无需处理线程的创建与线程同步问题
2、无需手动关闭Service

缺点:
无法精确控制线程执行过程,一旦线程启动后只能等待线程执行完毕

IntentService与Service区别

  1. IntentService是继承自Service;
  2. Service不是一个单独的进程,它和应用程序在同一个进程中;
  3. Service也不是一个线程,所以我们要避免在Service中进行耗时的操作;
  4. IntentService使用队列的方式将请求的Intent加入队列,然后开启了一个Worker Thread(工作线程)在处理队列中的Intent,对于异步的startService请求,
    IntentService会处理完成一个之后在处理第二个,每一个请求都会在一个单独的Worker Thread中处理,不会阻塞应用程序的主线程。
    因此,如果我们如果要在Service里面处理一个耗时的操作,我们可以用IntentService来代替使用。
  5. 使用IntentService 必须首先继承IntentService并实现onHandleIntent()方法,将耗时的任务放在这个方法执行,其他方面,IntentService和Service一样。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值