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(进行跨进程通信),以后会继续跟进博客的。

拓展培训后记--过雷区

今天想写点的东西,不然自己的blog是空的,啊啊 正好今天看了一篇关于项目管理的文章,想起了前段时间的一个拓展培训,拿说来说点东西记得9月的某一天,公司拉着2004年度的优秀员工去临安的大清湖做拓展培...
  • lixj0571
  • lixj0571
  • 2005年10月26日 12:05
  • 1022

2014年软件设计师考试后记

通过2014年上半年软件设计师考试的感悟
  • ynnmnm
  • ynnmnm
  • 2014年07月18日 00:33
  • 1793

译后记:C是伟大且垃圾的语言

对于每一个C程序员,不论是菜鸟、教师还是资深程序员,Dennis M. Ritchie所写的The Development of the C Language,应该是必读的文献。通过google其中文...
  • yqj2065
  • yqj2065
  • 2013年06月09日 11:45
  • 1952

【排版】你可能会用上瘾的排版指南

前言 对美的追求,提升读者阅读体验。 背景 曹老师接收的反馈。 公众号上的 15 期的一篇文章。 微信上,网络上无数的鸡汤文。 总结 空格 加空格 中文与英文之...
  • MrBaymax
  • MrBaymax
  • 2017年12月11日 16:43
  • 396

教育中的反思精神——从书籍《创造:一流大学之魂》的一则评论谈起

这些天一直在思考“大学教学中,到底应该教什么?怎么教?”的问题,随着教书时间的增加,就越来越困惑。为我们的学生惋惜,四年大学下来,能够对人生与理想有一个较为明确目标的人太少。虽然如一个大四学生所说,“...
  • dingyouzhuan0221
  • dingyouzhuan0221
  • 2014年05月09日 21:22
  • 1495

python数据分析与挖掘实战 第六章 拓展思考

企业偷漏税识别模型 1、数据探索 偷漏税企业分布 首先生成dataimport pandas as pd inputfile = r'E:\Download\百度云\图书配套数据、代码\chapte...
  • qq_26978413
  • qq_26978413
  • 2017年10月14日 15:13
  • 229

python数据分析与挖掘实战 第七章 拓展思考

流失客户分类模型 1 数据预处理 如果动手做过的人可能面临的第一个问题就是,这数据读进pandas怎么弄编码结果都是错的。如果你存在这样的问题,那么我建议你使用NotePad++载入文件以后,改成无B...
  • qq_26978413
  • qq_26978413
  • 2017年10月24日 17:00
  • 146

扩展mybatis generator

最近,把以前我自己一直在用mybatis generator扩展重构了一下,放到了github上,至于为什么要做这个扩展,官方的工具不错,但是架构层面,一旦数据库修改,重新生成的时候,就会很麻烦。 ...
  • wangjian5748
  • wangjian5748
  • 2016年05月30日 00:01
  • 7049

看完《形式感+网页视觉设计创意拓展与快速表现》总结

看完这一本书之后,在设计方面感觉收获很多,对于网页前端也有一定的帮助,这一本书关系到响应式的设计,特别对于大屏幕设计有很多技巧,这一本书真的值得推介。 废话少说,简单写一下看完这一本书的技巧收获。 ...
  • heweiting123
  • heweiting123
  • 2015年09月04日 13:58
  • 1075

Remote Service拓展

通常每个应用程序都在它自己的进程内运行,但有时需要在进程之间传递对象(IPC通信),你可以通过应用程序UI的方式写个运行在一个不同的进程中的service。在android平台中,一个进程通常不能访问...
  • Kaiwii
  • Kaiwii
  • 2013年01月24日 07:45
  • 640
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Service后记与拓展
举报原因:
原因补充:

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