Service作为Android四大组件之一,在Android系统中有着居住轻重的位置。
Service有两种启动方式,第一种就是通过Context.startService来启动,此时的Service为启动状态的Service,第二种通过bindService启动。
对于第一种情况,在通过StartService启动之后执行onCreate-onCommand,这个Service便会一直运行下去,直到调用了Context.stopService或者Service自身由于任务完成调用了selfDestroy。而对于第二种情况的,Service在被第一个宿主绑定的时候启动,依次执行onCreate-onBind,多个宿主可以同时绑定一个Service,直到最后一个宿主unbind该Service之后该Service才会被Destroy。
下面为通过第一种情况来实现的Service,即启动状态的Service:
public class StartableService extends Service {
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
直接继承Service,实现onBind方法,这边是一个最简单的Service,这个Service什么都没有做。但这样的Service是无法被启动的,我们还需要再Manifest文件中进行Service的申明,就像申明Activity一样:
<service android:name=".StartableService"/>
如此一来这个Service便可以被启动了点击“启动StartableService”
接下来我们通过客户端与Service进行通信,Service代码修改为
public class StartableService extends Service {
String TAG = getClass().getSimpleName();
MyBinder mBinder = new MyBinder();
public class MyBinder extends Binder{
public StartableService getService(){
return StartableService.this;
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
...
客户端代码
public class StartableServiceActivity extends Activity {
private Intent mIntent;
StartableService service;
ServiceConnection conn = new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
StartableService.MyBinder binder = (StartableService.MyBinder) iBinder;
service = binder.getService();
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
};
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_startable_service);
mIntent = new Intent(this,StartableService.class);
findViewById(R.id.btnStartService).setOnClickListener(v->{
bindService(mIntent,conn,Service.BIND_AUTO_CREATE);
});
findViewById(R.id.btnStopService).setOnClickListener(v->{
if (service!=null) {
service = null;
unbindService(conn);
}
});
findViewById(R.id.btnEvokeService).setOnClickListener(v->{
if (service!=null){
Toast.makeText(StartableServiceActivity.this,service.getInfo(),Toast.LENGTH_LONG).show();
}
});
}
}