1.service如windows下面的服务是差不多的,没有用户界面,只是在后台工作,比如 音乐播放、下载可以使用Service
2.Activity怎么和service绑定,怎么在activity中启动自己对应的service:
service本身不能自己启动,要调用其他方法才能启动service。
有如下两种方法:
startService():使用这个方法时,service与启动者是没有关系的,只是单纯的启动service,若启动者退出了,service依旧在后台运行。(如音乐播放,即使退出了程序,音乐还在播放着)
bindService():使用此方法时,顾名思义,就是把启动者与service绑定在一起了,启动者退出,service也跟着停止
3.service的生命周期:
1)startService方式的生命周期:
启动时,调用startService方法 –>onCreate() –> onStart()
停止时,调用stopService 方法 –> onDestroy()
2)bindService方式的生命周期:
绑定时,调用bindService方法 ->onCreate() –> onBind()
解绑定时,调用unbindService方法 –>onUnbind() –> onDestory()
4.如果这几个方法交织在一起的话,会出现什么情况呢?
一个原则是Service的onCreate的方法只会被调用一次,就是你无论多少次的startService又bindService,Service只被创建一次。
1)如果先是bind了,那么start的时候就直接运行Service的onStart方法,如果先是start,那么bind的时候就直接运行onBind方法。
2)如果service运行期间调用了bindService,这时候再调用stopService的话,service是不会调用onDestroy方法的,service就stop不掉了,只能调用UnbindService, service就会被销毁
4)如果一个service通过startService 被start之后,多次调用startService 的话,service会多次调用onStart方法。多次调用stopService的话,service只会调用一次onDestroyed方法。
5)如果一个service通过bindService被start之后,多次调用bindService的话,service只会调用一次onBind方法。多次调用unbindService的话则会抛出异常
5.Activity如果要调用Service里面的方法,一般是两种启动Service的方式一起使用,代码如下:
1.创建一个类继承Service,在MyService里创建一个内部类继承Binder:
public class MyService extends Service {
@Override
public IBinder onBind(Intent intent) {
// TODO 自动生成的方法存根
return new MyBinder();
}
private void log(){
Log.e("TAG","来自Service的方法");
}
public class MyBinder extends Binder {
public void getData() {
log();
}
}
}
2.在Activity中通过启动服务和绑定服务,得到MyBinder对象
Intent service = new Intent(this, Time.class);
startService(service); //启动服务
bindService(service, conn, Context.BIND_AUTO_CREATE);
super.onStart(); //绑定服务
private MyBinder myBinder;
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName arg0) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myBinder = (MyBinder) service; //绑定服务成功时,会调用次方法,这样就得到了MyBinder对象
}
};
3.通过MyBinder对象就可以直接调用Service里的方法了:
myBinder.getData();
转载于:https://blog.51cto.com/4131541/1637689