问题:
1 一般来说bindService会导致onServiceConnected被调用,unbindService会导致onServiceDisconnected被调用,对吗?
2一般service所在进程被杀死了之后会怎么处理?
首先启动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是指运行在其他进程中的service,一般在manifest中指定process,如果没有指定,那service就是运行在主进程之中。指定process的时候,如果以冒号开头的就是私有进程,其他程序无法访问,否则就是全局进程,一般我们都使用私有进程,避免其他程序访问。
远程service可以直接被start,但无法被bind,可参考http://blog.csdn.net/guolin_blog/article/details/9797169
远程service命名问题
远程service,而且非私有的service进程,命名必须有小数点
android:process="myservice"会出现INSTALL_PARSE_FAILED_MANIFEST_MALFORMED错误,必须有小数点
android:process="com.myservice"就可以了
onBind null
Service.onBind如果返回null,则调用 bindService 会启动 Service,但不会连接上 Service,因此 ServiceConnection.onServiceConnected 不会被调用,但你任然需要使用 unbindService 函数断开它,这样 Service 才会停止。
bindService启动service流程
如果以bind方式启动service,那么一般情况下调用流程是:service.onCreate --> service.onBind --> onServiceConnected.
这个过程中,如果onBind返回了null,那么onServiceConnected不会被调用。
unbindService与onServiceDisconnected
unbindService与bindService对应,但是注意unbindService会导致service.onUnbind被调用,但是不会导致onServiceDisconnected方法被调用。onServiceDisconnected只有在service所在进程崩溃或者被杀死时才会调用,一般来说,如果service正常退出时不会调用onServiceDisconnected的。
onStartCommand与onStart区别
很久很久以前只有onStart没有onStartCommand,后来出现了onStartCommand
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后一定能重启。
看源码 mStartCompatibility = getApplicationInfo().targetSdkVersion
< Build.VERSION_CODES.ECLAIR;
< Build.VERSION_CODES.ECLAIR;
可知我们的应用程序 targetSdkVersion 小于 2.0那么就返回 START_STICKY_COMPATIBILITY,否则返回 START_STICKY
问题答案:
1 bindService之后,如果onBind不返回null,那的却会导致onServiceConnected被调用。unbindService不会导致onServiceDisconnected被调用,只有service所在进程被杀死或者崩溃的时候,onServiceDisconnected才会被调用