Service属于四大组件之一,有两种不同的启动方式,bindService和startSrtvice,不同的启动方式生命周期不一样,
要想使用Service需要写一个自己的MyService类,并继承Service。还要在清单文件中声明一下
<service android:name=".MyService"/>
public class MyService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.e("call", "onBind");
return null;
}
@Override
public void onCreate() {
Log.e("call", "onCreate");
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e("call", "onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
Log.e("call", "onDestroy");
super.onDestroy();
}
}
startService开启服务和结束服务稍微简单一点。
//开启服务
Intent service = new Intent(this, MyService.class);
startService(service);
//结束服务
stopService(service);
开启服务时,调用一次startService,生命周期执行的方法依次是:
onCreate() ==> onStartCommand();
调用多次startService,onCreate只有第一次会被执行,而onStartCommand会执行多次。
结束服务时,调用stopService,生命周期执行onDestroy方法,并且多次调用stopService时,onDestroy只有第一次会被执行。
bindService开启服务就多了一些内容。
//开启服务
Intent service = new Intent(this, MyService.class);
MyConnection conn = new MyConnection();
//第一个参数:Intent意图
//第二个参数:是一个接口,通过这个接口接收服务开启或者停止的消息,并且这个参数不能为null
//第三个参数:开启服务时的操作,BIND_AUTO_CREATE代表自动创建service
bindService(service, conn, BIND_AUTO_CREATE);
bindService的方法参数需要一个ServiceConnection接口的实现类对象,我们自己写一个MyConnection类,并实现里面的方法。
private class MyConnection implements ServiceConnection{
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//只有当我们自己写的MyService的onBind方法返回值不为null时,才会被调用
Log.e("call","onServiceConnected");
}
@Override
public void onServiceDisconnected(ComponentName name) {
//这个方法只有出现异常时才会调用,服务器正常退出不会调用。
Log.e("call","onServiceDisconnected");
}
}
//结束服务
unbindService(conn);
下面来说一下,bindService和startService启动时和Activity的联系,
startService启动后和Activity没有关系了,独立运行,
bindService启动后和Activity有联系,Activity退出时要调用unbindService,否则会报ServiveConnection泄露的错误