Android四大组件之一 -- Service(服务)

一,简介

1.四大组件之一,没有界面但可以开辟线程访问网络操作数据库

2.用于在后台处理耗时操作

3.不受activity生命周期影响

二,生命周期

1.onCreate() 创建

2.onStartCommand() 启动

3.onBind() 绑定

4.onUnbind() 解绑

5.onDestroy() 销毁

创建service
在这里插入图片描述

public class MyServices extends Service {
    public MyServices() {
    }

//创建
@Override
public void onCreate() {
    super.onCreate();
    Toast.makeText(this,"创建了服务",Toast.LENGTH_SHORT).show();
    Log.e("tt","创建了服务");
}
//启动
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Toast.makeText(this,"启动了服务",Toast.LENGTH_SHORT).show();
    Log.e("tt","启动了服务");
    return super.onStartCommand(intent, flags, startId);

}

//绑定
@Override
public IBinder onBind(Intent intent) {
    Toast.makeText(this,"绑定了服务",Toast.LENGTH_SHORT).show();
    Log.e("tt","绑定了服务");

// throw new UnsupportedOperationException(“Not yet implemented”);
return null;
}

//解绑
@Override
public boolean onUnbind(Intent intent) {
    Toast.makeText(this,"解绑了服务",Toast.LENGTH_SHORT).show();
    Log.e("tt","解绑了服务");
    return super.onUnbind(intent);
}
//销毁
@Override
public void onDestroy() {
    Toast.makeText(this,"销毁了服务",Toast.LENGTH_SHORT).show();
    Log.e("tt","销毁了服务");
    super.onDestroy();
}
}

@Override
    public void onClick(View v) {
        //依次:启动(创建-》启动)-》绑定服务(绑定)-》解绑服务(解绑)-》停止服务(销毁)
        //如果先点击绑定服务 那么要通过解绑服务才能销毁
        switch (v.getId()){
            //启动服务  点击之后 创建-》启动
            //如果服务已经创建了 后续重复启动都是相同的服务
            case R.id.start:
                Intent intent = new Intent(this,MyServices.class);
                startService(intent);
                break;
            //停止服务  点击之后 停止服务-》销毁服务
            case R.id.stop:
                Intent intent1 = new Intent(this,MyServices.class);
                stopService(intent1);
                break;
            //绑定服务
            case R.id.bind:
                //没有创建服务 直接点击绑定会先创建在绑定 但是没有启动 后台也不会有服务
                //BIND_AUTO_CREATE 意思是 如果服务存在直接绑定 如果不存在先创建在绑定
                Intent intent2 = new Intent(this,MyServices.class);
                bindService(intent2,serviceConnection,BIND_AUTO_CREATE);
                break;
            //解绑服务  解绑-》销毁
            case R.id.unbind:
                unbindService(serviceConnection);
                break;
        }
    }

三.实现进度监控

执行操作顺序:启动服务(创建启动)-》绑定服务-》解绑服务-》绑定(可重复绑定,获取相同服务进度)

点击启动服务 创建服务和启动服务中的耗时操作

点击绑定 获取服务中的进度

点击解绑 解绑服务

点击停止服务 停止和销毁服务 此时要重新点击启动在绑定才会获取进度

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private Button start;
private Button stop;
private Button bind;
private Button unbind;
//进度监控
private ServiceConnection serviceConnection = new ServiceConnection() {
    //当客户端和服务正常连接时 执行的绑定操作会被调用
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        //3.获取自定义service中返回来了的service中Mbinder获取进度
        MyServices.Mbinder mbinder = (MyServices.Mbinder)service;
        Log.e("tt","" + mbinder.geii());
    }
    //当客户端和服务连接丢失 会被调用
    @Override
    public void onServiceDisconnected(ComponentName name) {

    }
};


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    start = findViewById(R.id.start);
    stop = findViewById(R.id.stop);
    bind = findViewById(R.id.bind);
    unbind = findViewById(R.id.unbind);
    start.setOnClickListener(this);
    stop.setOnClickListener(this);
    bind.setOnClickListener(this);
    unbind.setOnClickListener(this);

}

@Override
public void onClick(View v) {
    //依次:启动(创建-》启动)-》绑定服务(绑定)-》解绑服务(解绑)-》停止服务(销毁)
    //如果先点击绑定服务 那么要通过解绑服务才能销毁
    switch (v.getId()){
        //启动服务  点击之后 创建-》启动
        //如果服务已经创建了 后续重复启动都是相同的服务
        case R.id.start:
            Intent intent = new Intent(this,MyServices.class);
            startService(intent);
            break;
        //停止服务  点击之后 停止服务-》销毁服务
        case R.id.stop:
            Intent intent1 = new Intent(this,MyServices.class);
            stopService(intent1);
            break;
        //绑定服务
        case R.id.bind:
            //最大的作用就是用来实现对service执行的任务进行进度监控
            //没有创建服务 直接点击绑定会先创建在绑定 但是没有启动 后台也不会有服务
            //BIND_AUTO_CREATE 意思是 如果服务存在直接绑定 如果不存在先创建在绑定
            Intent intent2 = new Intent(this,MyServices.class);
            bindService(intent2,serviceConnection,BIND_AUTO_CREATE);
            break;
        //解绑服务  解绑-》销毁
        case R.id.unbind:
            unbindService(serviceConnection);
            break;
    }
}
}

public class MyServices extends Service {

private int i;

public MyServices() {
}

//创建
@Override
public void onCreate() {
    super.onCreate();
    Toast.makeText(this,"创建了服务",Toast.LENGTH_SHORT).show();
    Log.e("tt","创建了服务");
    //1.模拟耗时操作
    new Thread(){
        @Override
        public void run() {
            super.run();
            for ( i = 0; i < 100 ; i++) {
                try {
                    sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }.start();
}
//启动
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Toast.makeText(this,"启动了服务",Toast.LENGTH_SHORT).show();
    Log.e("tt","启动了服务");
    return super.onStartCommand(intent, flags, startId);

}

//绑定
//IBinder 用于远程操作对象的一个接口
@Override
public IBinder onBind(Intent intent) {
    Toast.makeText(this,"绑定了服务",Toast.LENGTH_SHORT).show();
    Log.e("tt","绑定了服务");
//        throw new UnsupportedOperationException("Not yet implemented");
        return new Mbinder();
    }

//解绑
@Override
public boolean onUnbind(Intent intent) {
    Toast.makeText(this,"解绑了服务",Toast.LENGTH_SHORT).show();
    Log.e("tt","解绑了服务");
    return super.onUnbind(intent);
}
//销毁
@Override
public void onDestroy() {
    Toast.makeText(this,"销毁了服务",Toast.LENGTH_SHORT).show();
    Log.e("tt","销毁了服务");
    super.onDestroy();
}

//2.自定义binder类 binder是继承于IBinder类
class Mbinder extends  Binder{

    //定义自己的方法 获取耗时操作里面的进度
    public int geii(){
        return i;
    }

}
}

猜你喜欢

转载自blog.csdn.net/weixin_43609490/article/details/87971632