1、Service是否在主线程中执行,service里面是否能执行耗时的操作?
默认情况下,如果没有特殊指定Service所运行的进程,那么Service的Activity是运行在当前app所在进程的主线程里面的。不仅仅是服务,其实四大组件都是。
主线程不能执行耗时操作(网络请求,拷贝数据库,复制下载大文件)
特殊情况下,可以在清单文件中配置service所在的进程,让service在另外的进程中执行
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" >
</service>
2、Activity怎么和Service绑定,怎么在Activity中启动自己对象的Service?
Activity通过bindService(intent service,ServiceConnecton conn,int flags)跟Service进行绑定,当绑定成功的时候,Service会将代理对象通过回调的形式传递给conn,这样我们就可以拿到Service提供的服务代理对象。
在Activity中两种方式可以开启Service,一种是StartService、一种是bindService,如果需要拿到拿到我们的服务对象,并且去调用里面的方法的时候我们必须使用bind模式开启服务,比如第三方支付,音乐播放等,但是,如果只是需要简简单单的开启一个后台运行的服务的话,我们可以直接使用startService来开启。
3、Service的生命周期
对于Service,不同的开启方式,对应的生命周期也是不同的。
非绑定模式开启:执行onCreate方法后执行onStartCommand,在service被关闭销毁的时候调用onDestroy方法。
绑定模式开启:执行onCreate方法后执行onBind方法,在销毁的时候调用onUnbind和onDestroy方法
上面的两种serviece的生命周期是在相对单纯的情况下来说的,需要注意的是,service的实例只会有一个,也就是说,如果我们当前想要开启的这个service已经存在,那么这一次的开启将不会再调用onCreate方法来实例化!
一个service可以被多个客户所绑定,只有当所有的绑定对象的onbind方法全部执行完了以后,这个service才有机会被销毁,打个比方说,当很多的客户都调用了unbind方法以后,那么如果其中一个客户却调用了onstart方法,那么这个sercice也不会被销毁,也就说说,当所有的客户的去求都完成的时候,才可以销毁服务。
这两种开启服务的方式,并不是完全没有互斥的,他们可以联合开启,比如我们已经用startService开启了一个服务,我们在后面的逻辑中需要调用服务中的方法,那么我们还可以在用bindService来再开启一次,两次开启并不闹矛盾,在这种情况下,我们并不能通过stopself或者stopservice方法来停止我们的服务,必须是我们的所有的客户都解除了对这个服务的绑定后才行。
4、什么是IntentService?有什么优点?
IntentService是Service的子类,比普通的Service增加了功能,Service只能运行在当前应用程序的主线程中,不能在其中处理耗时的操作。
IntentService的特征:
会独立创建一个work线程处理所有的intent请求,会处理onHandleIntent方法中的代码,无需处理多线程的问题,并且在处理完所有的intent请求后,会自动销毁,不需要调用stopService方法来停止。
5、Activity、Service、intent之间有什么关系?
前两个属于兄弟关系,因为他们都继承自ContextWrapper类(Context的子类),但是他们各有各的本事,一个负责界面的交互,一个负责在后台运行。intent可以在他们两者之间进行数据交换,可以看做是一个通讯使者。
本文转自诡道网!由杨小杰blog进行排版整合。
发表评论: