Android中程序与Service交互的方式——综述:http://blog.csdn.net/yihongyuelan/article/details/7215990
Android中程序与Service交互的方式——交互方式:http://blog.csdn.net/yihongyuelan/article/details/7216188
Android中程序与Service交互的方式——总结:http://blog.csdn.net/yihongyuelan/article/details/7216218
Android Service完全解析,关于服务你所需知道的一切(上):http://blog.csdn.net/guolin_blog/article/details/11952435
Android Service完全解析,关于服务你所需知道的一切(下):http://blog.csdn.net/guolin_blog/article/details/9797169
我的分析:
我们为什么要使用服务?
这个题目为何非要使用service呢,我们直接在activity中开一个线程,使用一下handler不就行了吗?
问题所在:这样当然可以,但是如果我们按了返回键这个activity就被finish了,而服务器端还在给你回复数据,你就接受不到了呀。所以我们把他放到服务里面,而服务是整个跟随着应用程序的,只要应用程序不退出,服务一直在,即使离开这个activity到另一个activity,服务照样的在接受数据。
那我要Service又有何用呢?其实大家不要把后台和子线程联系在一起就行了,这是两个完全不同的概念。Android的后台就是指,它的运行是完全不依赖UI的。即使Activity被销毁,或者程序被关闭,只要进程还在,Service就可以继续运行。比如说一些应用程序,始终需要与服务器之间始终保持着心跳连接,就可以使用Service来实现。你可能又会问,前面不是刚刚验证过Service是运行在主线程里的么?在这里一直执行着心跳连接,难道就不会阻塞主线程的运行吗?当然会,但是我们可以在Service中再创建一个子线程,然后在这里去处理耗时逻辑就没问题了。
额,既然在Service里也要创建一个子线程,那为什么不直接在Activity里创建呢?这是因为Activity很难对Thread进行控制,当Activity被销毁之后,就没有任何其它的办法可以再重新获取到之前创建的子线程的实例。而且在一个Activity中创建的子线程,另一个Activity无法对其进行操作。但是Service就不同了,所有的Activity都可以与Service进行关联,然后可以很方便地操作其中的方法,即使Activity被销毁了,之后只要重新与Service建立关联,就又能够获取到原有的Service中Binder的实例。因此,使用Service来处理后台任务,Activity就可以放心地finish,完全不需要担心无法对后台任务进行控制的情况。
android IPC有两种方式:信使(Messenger)和AIDL,其实信使底层也是用的AIDL,对于信使具体的时序图如下: