之前的项目用到了service,对于这个组件一直是一知半解的。今天有时间总结下:
1,启动一个service有两种方法:context.startservice与context.bindservice
2. service的生命周期:context.startservice来启动的时候oncreate()~onstartcommand()~context.stopService()~ondestory()
context.bindservice来启动是:oncreate()~onbind()~onunbind()~ondestory()
其中1),用bindservice来启动时,调用者,如activity,fragment与service实例绑定在一起,调用者退出,则service也结束
用startservice来调用时,即使app退出,service依然运行
2)混合避免使用着两种
3.context.bindservice的使用方法:
A: 在service里写一个继承自binder的内部类用以得到service的实例
重写onbind方法返回一个重写的binder实例
eg:
public class LocalService extends Service {
private static final String TAG = "LocalService";
private IBinder binder=new LocalService.LocalBinder();
@Override
public IBinder onBind(Intent intent) {
return binder;
}
@Override
public void onCreate() {
Log.i(TAG, "onCreate");
//这里可以启动媒体播放器
super.onCreate();
}
@Override
public void onStart(Intent intent, int startId) {
Log.i(TAG, "onStart");
super.onStart(intent, startId);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG, "onStartCommand");
return START_STICKY;
}
@Override
public void onDestroy() {
Log.i(TAG, "onDestroy");
super.onDestroy();
}
//定义内容类继承Binder
public class LocalBinder extends Binder{
//返回本地服务
LocalService getService(){
return LocalService.this;
}
}
}
B): 在调用者里 重写一个serviceconnection
eg:
new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName componentName, IBinder binder) {
//调用bindService方法启动服务时候,如果服务需要与activity交互,
//则通过onBind方法返回IBinder并返回当前本地服务
localService=((LocalService.LocalBinder)binder).getService();
//这里可以提示用户,或者调用服务的某些方法
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
localService=null;
//这里可以提示用户
}
}
}
C):调用时用context.bindservice(new intent(LocalService.class),new connection,Context.BIND_AUTO_CREATE)