问题:
首先启动service的方式有2种,startSerice和bindService,这是context的方法,不仅仅activity的context可以调用,application的context也可以调用
startService启动Service
- 当启动一个Service的时候,会调用该Service中的onCreate()和onStartCommand()方法。
- 如果当前Service已经被创建过了,不管怎样调用startService()方法,onCreate()方法都不会再执行,onStartCommand()会执行。
- startService可以被调用很多次,但是调了无论多少次startService,只要一次stopService就可以结束此Service,通过多次startService,传入不同的intent,可以控制service的行为,可见Android Service 服务(一)—— Service文中的例子(核心代码是 Bundle bundle = new Bundle();
bundle.putInt("op", op);
intent.putExtras(bundle); )
bindServiece启动Service
以BIND_AUTO_CREATE方式bindService会调用onCreate()和onBind()方法,再一次bindService的话,不会发生任何事
如果一个activity bind了service之后,直接退出界面,会出现leaked ServiceConnection的error
startService和bindService共用
这2种模式不是完全分离的。你可以可以绑定到一个通过startService()启动的服务。如一个intent想要播放音乐,通过startService() 方法启动后台播放音乐的service。然后,也许用户想要操作播放器或者获取当前正在播放的乐曲的信息,一个activity就会通过bindService()建立一个到此service的连接. 这种情况下 要unbindService且stopService()(2者顺序无所谓) 才会真正停止service。
远程service和process指定
远程service命名问题
onBind null
bindService启动service流程
unbindService与onServiceDisconnected
unbindService与bindService对应,但是注意unbindService会导致service.onUnbind被调用,但是不会导致onServiceDisconnected方法被调用。onServiceDisconnected只有在service所在进程崩溃或者被杀死时才会调用,一般来说,如果service正常退出时不会调用onServiceDisconnected的。
onStartCommand与onStart区别
public int onStartCommand(Intent intent, int flags, int startId) {
onStart(intent, startId);
return mStartCompatibility ? START_STICKY_COMPATIBILITY : START_STICKY;
}
看代码onStartCommand还是调用了onStart,但是他有个int返回值
这个方法需要返回一个整型值。这个整型代表系统应该怎么样处理这个Service:
- START_STICKY:使用这个返回值,如果系统杀死我们的Service将会重新创建。但是,发送给Service的Intent不会再投递。这样Service是一直运行的。
- START_NOT_STICKY:如果系统杀死了Service,不会重新创建,除非客户端显式地调用了onStart命令。
- START_REDELIVER_INTENT:功能与START_STICKY类似。另外,在这种情况下Intent会重新传递给Service。
- START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。
< Build.VERSION_CODES.ECLAIR;