前情回顾?学完AsyncTask就马上学了Service,那么之间的联系在哪呢。。啧啧啧,萌新瑟瑟发抖,初步猜想,AsyncTask是基于异步消息处理机制原理的工具,能通过调用publishProgress()从子线程切换到主线程,而service的三贱客方法则全部在主线程之中运行,服务中如果有一些耗时逻辑,那么很容易造成ANR,所以服务需要灵活运用线程,那么将Service和AsyncTask结合起来就很有必要了。
对于服务本身,如果单单只使用startService和StopService有些太过单调,从具体层面来讲,你开启了服务之后,并不能实时掌控服务本身具体的情况,比如如果假定这个服务运行5分钟左右,那么三分钟左右的时候你知道它实际进行到什么程度吗?不知道吧,那么就是说活动和服务的联系太松了,需要让它们更紧密,类似于当服务后台因为某种原因停止了,但又没导致程序崩溃,这时候我需要知道这个情况,并使用某种方法让服务重启,而不是傻傻等在那,怀着那蜜汁5分钟搞定的自信。那么问题就更深一步了,该怎么让除了startService和StopService的方法来控制或者监察服务呢,那个平常遇不到的onBind()就是这时候起作用的啊!
比如在Service中提供一个下载功能,如果抱着哦,那就写在onStartCommand里的想法就错了,emmm,启动服务之后onStartCommand只被调用一次,而且如果想实时监控下载进度这种设计UI的东西,还是要有onBind()比较适合。具体使用方法是在MyService中定义一个内部类提供具体的需要的功能,这里是下载功能,然后通过onBind()返回该内部类的一个对象,这是在MyService需要做的处理,然后对于在活动界面的工作也是类似,只不过在活动界面的代码中,通过的媒介是ServiceConnection,将下载功能中的方法有删选的通过功能类对象调用加入到connection的两个重写方法,onServiceConnected和onServiceDisConnected中去。当在主活动需要bindService的时候,可以把connection传进去。
怎么说呢,当startService被调用,相应的服务就会启动,然后就会回调onStartCommand()方法,如果服务是第一次!!!那就会先来一发onCreate(),嗯,之后点点点,也只有onStartCommand()会不断执行执行执行,但实际一个服务只有一个实例,(类似于活动的单实例?!)所以不管多少次startService,来一发stopService就可以让它消停。
这个和bindService有比较大的区别,其中一个就是bindService建立服务连接之后回调的是onBind()而不是onBind(),而且这个神奇的onBind()只会在刚创建连接的时候执行一次,以后再也调用不到啊,哟哟哟。如果对一个服务既有startService,又有bindService,那么需要两发(stopService+unBindService)才能销毁服务。