Service 不像Activity有那么多得生命周期方法,
Service 只有两种状态 启动 和没启动
启动时 会调用 onCreate
死掉时, 即状态变为没启动时, 会回调 onDestroy方法
调用 startService 时 Service会执行
onCreate (如果Service没有启动则会执行该方法)
onStart
oStartCommand
调用 bindService 时 Service 会执行
onCreate(如果Service没有启动则会执行该方法)
onBind 方法 (第一个客户端 bind 才会执行)
startService 和 bindService 都很好理解,
startService 只是单纯的启动Service ,可以调用多次, 如果Service 没有启动则则Service会自己启动
bindService 只是单纯的连接Service ,一个connection只能调用一次, 即使调用多次页没反应. 如果Service没有启动则Service会自己启动
接下来看stopService 停止服务,
当没有客户端 bind连接到Service时, 调用stopService 可以停掉Service , 会回调 OnDestroy方法
当有客户端bind连接到Service时, 调用stopService 不能停掉Service.
但是如果执行了stopService 可以理解为, 调用startService 的人, 与Service 没有任何关系了.
接下来看, unbindService 方法, 解除与Service的绑定.
需要注意的是, 可以有多个客户端连接Service,
只有在第一个客户端调用bindService 时, Service 才会执行 onBind方法
只有在最后一个客户端调用unBindService时, Service 才会执行onUnbind方法
当最后一个客户端调用unBindService时,
如果 Service 与 调用startService 的人 还有关系, 那么Service不会自己停掉
如果Service 与调用startService 的人 没有任何关系了, 或压根就没这个人, 即没有调用过startService 方法,
那么 Service 会自己停掉,会回调 OnDestory方法
在没有该客户端没有bindService 时, 调用unBindService是, 则会抛出异常
java.lang.IllegalArgumentException: Service not registered
在测试过程中发现:
当启动 了某个service 然后 app中途崩溃了, 前提进程没所有死掉
那么在重启启动 app时 Service 会自己启动
上面都已写结论性质的东西下面在看看部分实现代码
下面是Activity的部分代码
mStartButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startService(intent);
}
});
mStopButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stopService(intent);
}
});
mBindButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);
}
});
mUnBindButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
unbindService(mServiceConnection);
}
});
mBindButton2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
bindService(intent, mServiceConnection2, Context.BIND_AUTO_CREATE);
}
});
mUnBindButton2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
unbindService(mServiceConnection2);
}
});
private ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
LogUtil.d(TAG, "onServiceConnected");
if (service != null) {
mMyService = ((MyService.ServiceBinder) service).getService();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
LogUtil.d(TAG, "onServiceConnected");
mMyService = null;
}
};
private ServiceConnection mServiceConnection2 = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
LogUtil.d(TAG, "onServiceConnected2");
if (service != null) {
mMyService = ((MyService.ServiceBinder) service).getService();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
LogUtil.d(TAG, "onServiceConnected2");
mMyService = null;
}
};
下面是Service的部分代码
public class MyService extends Service {
public static final String TAG = "MyService";
private IBinder mIBinder;
@Override
public void onCreate() {
super.onCreate();
LogUtil.d(TAG, "onCreate");
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
LogUtil.d(TAG, "onStart");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
LogUtil.d(TAG, "onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
LogUtil.d(TAG, "onDestroy");
}
@Override
public void onRebind(Intent intent) {
super.onRebind(intent);
LogUtil.d(TAG, "onRebind");
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
LogUtil.d(TAG, "onBind");
if (mIBinder == null) {
mIBinder = new ServiceBinder();
}
return mIBinder;
}
class ServiceBinder extends Binder {
public MyService getService() {
return MyService.this;
}
}
@Override
public boolean onUnbind(Intent intent) {
LogUtil.d(TAG, "onUnbind");
return super.onUnbind(intent);
}
}