Service后记与拓展

原创 2015年11月18日 17:55:26

使用细节


1.在注册服务的时候,为了将service纳入编译系统,必须在AndroidMainfest.xml中对Service进行显式声明。


2.计算量较大的又不是UI层的工作的话,可以选择放置在Service中进行工作。


3.通过开发文档你会发现,Android中的Service与宿主(调用者)在同一线程,而不是专门起一条线程,这意味着,如果你的服务要CPU密集型操作(如:MP3播放)或则阻塞操作(如网络)时,必须产生它自己的线程来完成这个工作,否则会造成线程阻塞。在Service的子类里面,IntentService服务可以作为一个标准实施,它的工作自己线程


4.如果在使用Service的时候又使用了广播接收器配合工作,广播如果是动态注册的话,在服务停止的时候记得调用unregisterReceiver(receiver);这个方法来注销掉接收器




拓展


1.如何检查Android后台服务线程(Service类)是否正在运行


Android系统自己提供了一个函数ActivityManager.getRunningServices,可以列出当前正在运行的后台服务线程

private boolean isServiceRunning() {  
    ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);  
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {  
        if ("com.example.MyService".equals(service.service.getClassName())) {  
            return true;  
        }  
    }  
    return false;  
}  


2.Service与UI之间的通信方式


(1)使用直接启动的startService实现信息传递

流程:UI  ——>Service

操作:使用Intent进行数据传递,通过服务中的onStartCommand方法进行接受(和Activity间传递方式一样)


(2)使用绑定启动的bindservice实现信息传递

流程:UI  ——>Service


Broadcast(广播)进行信息的双向传递

流程:UI  <——>Service

操作:注册绑定广播接受器,之后通过广播来进行2者间通信

注意:在服务退出的时候记得unregisterReceiver(receiver);注销广播接收器


3.Service和Thread的区别

我们拿服务来进行一个后台长时间的动作,为了不阻塞线程,然而,Thread就可以达到这个效果,为什么我们不直接使用Thread去代替服务呢?(这个问题摘抄至网上,原文地址不是是哪个,所以没写上)

这里提下,


1). Thread:Thread 是程序执行的最小单元,它是分配CPU的基本单位。可以用 Thread 来执行一些异步的操作。 
2). Service:Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的 Service 是运行在主进程的 main 线程上的。如:onCreate,onStart 这些函数在被系统调用的时候都是在主进程的 main 线程上运行的。如果是Remote Service,那么对应的 Service 则是运行在独立进程的 main 线程上。因此请不要把 Service 理解成线程,它跟线程半毛钱的关系都没有!


既然这样,那么我们为什么要用 Service 呢?其实这跟 android 的系统机制有关,我们先拿 Thread 来说。Thread 的运行是独立于 Activity 的,也就是说当一个 Activity 被 finish 之后,如果你没有主动停止 Thread 或者 Thread 里的 run 方法没有执行完毕的话,Thread 也会一直执行。因此这里会出现一个问题:当 Activity 被 finish 之后,你不再持有该 Thread 的引用。另一方面,你没有办法在不同的 Activity 中对同一 Thread 进行控制。


举个例子:如果你的 Thread 需要不停地隔一段时间就要连接服务器做某种同步的话,该 Thread 需要在 Activity 没有start的时候也在运行。这个时候当你 start 一个 Activity 就没有办法在该 Activity 里面控制之前创建的 Thread。因此你便需要创建并启动一个 Service ,在 Service 里面创建、运行并控制该 Thread,这样便解决了该问题(因为任何 Activity 都可以控制同一 Service,而系统也只会创建一个对应 Service 的实例)。

因此你可以把 Service 想象成一种消息服务,而你可以在任何有 Context 的地方调用 Context.startService、Context.stopService、Context.bindService,Context.unbindService,来控制它,你也可以在 Service 里注册 BroadcastReceiver,在其他地方通过发送 broadcast 来控制它,当然这些都是 Thread 做不到的。 



利用服务




Service服务的总结就到这里,如果有什么错误或者需要补充之处可以提出来。


另外,使用AIDL方式的Service(进行跨进程通信),以后会继续跟进博客的。

相关文章推荐

SpringMVC学习系列-后记 开启项目的OpenSessionInView

在系列的 SpringMVC学习系列(12) 完结篇 的示例项目中,由于当时考虑到OpenSessionInView会对性能有一定的影响,所以就没有配置项目的OpenSessionInView。在ma...

软件项目经理新手上路 - 后记,一切才刚刚开始

如果你内向,同时觉得自己够聪明,就去做软件开发人员吧。这是我当时为什么从事软件行业的原因。而且,我发现不是我一个人这么想,中国内向的聪明人实在是太多了。这些人都认为,相对于面对人而言,他们更善于面对电...

第一篇论文阅读,后记,presentation总结

第一篇论文阅读:presentation总结presentation情况七点钟上课,但是六点半就到了研讨室外,读了一会儿考研作文,当作是提前“预热”一下喉咙。因为比较紧张的情况下,我总是感觉嗓子沙哑,...
  • OCTODOG
  • OCTODOG
  • 2017年04月17日 22:20
  • 225

【23.91%】【hdu 4694】Important Sisters("支NMLGB配树"后记)(支配树代码详解)

Time Limit: 7000/7000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Submiss...

超简单的ViewPager导航栏联动实现后记--当标题栏条目很多时

前面写了一篇简单的ViewPager的导航栏,只是 标题栏中的条目正好适合在屏幕中,如果标题栏过多,超过屏幕的宽度,该怎么弄,下面我们就来解决一下,效果如下: 其实和之前写的也差不多,我就是在...

Android源码剖析之Framwork层后记篇

有关资源访问: data/app:apk被复制后的目录,系统应用放在system/app目录下 data/dalvik-cache:class.dex的存放目录或odex data/...

SpringMVC学习系列-后记 解决GET请求时中文乱码的问题

之前项目中的web.xml中的编码设置: filter> filter-name>CharacterEncodingfilter-name> filter...

做一个合格的程序猿之浅析Spring IoC源码(十一)Spring refresh()方法解析后记1

上次分析refresh这块spring IoC的时候,时间比较仓促,只是debug了部分源码,大家分析起来不是很好~ 今天我们还是先总结一下吧~ spring在实例化bean的时候,根据bea...
  • linuu
  • linuu
  • 2016年03月14日 15:35
  • 941
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Service后记与拓展
举报原因:
原因补充:

(最多只允许输入30个字)