一,简介
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;
}
}
}