启动服务是有两组参数影响服务的状态。

1、在onStartCommand(Intent intent, int flags, int startId) 接口中返回值例如 START_STICKY; 表明开关计数不为0,表明服务如果被意外Kill掉(例如从DDMS中杀掉)服务会重新启动。

2、在bindService(Intent service, ServiceConnection conn,  int flags)中的最后一个参数, 例如Context.BIND_AUTO_CREATE,表明如果引用数不为0,服务如果被意外杀掉服务将重启。

     这两个方法实际上角度不同onStartCommand在客户端Start调用后被回调,表明服务自身定义的声明周期,是希望长周期运行还是用完即止。 而BindService是在客户端调用,表明了客户端希望服务在数据通信中的状态,是可靠连接还是不可靠连接。
     因此服务销毁的条件也相应拥有两个层面的条件, 
1、在服务层面从Start - Stop为一个完整的周期,Stat ()开关计数+1 Stop开关计数-1,引用数=0 表明系统可以销毁服务了。Stop必须被明确调动,开关计数才减1,客户端进程退出不影响服务端的开关计数,(这里解释了为什么应用都杀掉了,为什么服务还是杀不掉);
2、在客户端层面,Bind 到 UnBind是一个周期,Bind 连接计数+1,UnBind连接计数-1.  连接计数为0,系统即可销毁服务了。 与Start和Stop计数不同, 调用服务的线程被销毁,连接计数-1. (这里解释了为什么应用服务的程序被kill掉后,kill Bind创建的服务可以杀掉)
3、同时满足上述两个条件。服务才被销毁。
 
     正以上原因,解释了为什么,在Android 程序管理器中停止服务,然后在后台进程管理中杀掉服务进程,才能真正停止Start_STICKY的进程。终止服务实际上是将计数清零。
 
     从DDMS看看微信在后台运行的两个进程com.tencent.mm(应用服务)和com.tentcent.mm:push(推送服务)
      1、push推送服务进程能够独立运行, 而且被DDMS kill后会重新启动,应该是mm用Start方式创建的一个service,
      2、mm与push进程差不多,被DDMS kill后会重新启动,mm在总的运行时间上看比push时间短,应该是push启动它后,完成任务就stop退出了(或者stopself)。
     3、如果把mm和push的服务彻底停掉(从Android的服务管理器中),过几分钟后 push进程先恢复,然后mm再启动。(进程如何恢复,应该是使用了Alarmanger的机制,定期唤醒服务。)
     通过上述表现,可以分析push应该是一个保持基本连接通信的线程,内存消耗较小。腾讯的通信如果用的不是HTTP协议,就需要进程保持通信的长连接。mm应该是具体的数据处理和业务管理的,内存消耗较大。

从微信推送看Android Service的创建和销毁的更多相关文章

  1. 免注册公众号的三种微信推送消息服务的C#代码实现

    有时候我们需要监控一些网络上的变化,但是每次去刷新网页却又很麻烦,而且大部分刷新的时候网页并没有更新.那么有没有一个工具,可以监控网页变化,并将变化的结果推送到手机微信上呢? 这里有很多应用场景,比如 ...

  2. 接入WxPusher微信推送服务出现错误:Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported

    背景 使用WxPusher微信推送服务 ,可以及时的将服务的一些运行异常信息,发送到自己的微信上,方便了解服务的运行状态(PS:这个服务是免费的). 你可以在这里看到WxPusher微信推送服务的接入 ...

  3. [wxpusher]分享一个服务器推送消息到微信上的小工具,可以用于微信推送提醒和告警。

    背景 作为一个程序员,业余搞点自己的东西很正常,一般程序员都会有一两台自己的服务器,谁叫今天xx云搞活动,明天yy云搞活动呢. 自家的服务器用来跑爬虫,跑博客,或者跑一些个人业务,但当服务有新状态,抢 ...

  4. day93之微信推送

    python之微信推送详解 用什么推送   -邮件   -微信推送   -短信推送微信推送   -公众号(不能主动给用户发消息)    -认证的公众号:需要营业执照,需要交钱,可以发多篇文章    - ...

  5. Django day 36 支付宝支付,微信推送

    一:支付宝支付, 二:微信推送

  6. 让微信推送Jenkins构建消息

    Jenkins作为开发必备之神器,各家大小公司都在使用.Jenkins自身内置了基于邮件推送构建结果的功能.但是随着移动互联网的发展,邮件这玩意已经越来越少使用了,是否有一种办法能把jenkins构建 ...

  7. 使用WxPusher给自己的个人微信发送提醒消息(WxPusher微信推送服务)

    1.背景 我们很多时候,我们在服务器上运行软件,发生一些业务异常,需要给我们发送一个及时的提醒,或者是使用一些耗时软件,比如抢车票,抢课,刷优惠券当任务运行成功以后,也需要及时的发送消息给自己 ,告诉 ...

  8. SpringBoot 实现微信推送模板

    导读 由于最近手头上需要做个Message Gateway,涉及到:邮件(点我直达).短信.公众号等推送功能,网上学习下,整理下来以备以后使用. 添加依赖 在SpringBoot项目中添加依赖 < ...

  9. CQUT校园通知网消息爬虫+Server酱微信推送

    上了大三之后发现很多学校的通知都不会发送到班群里面,导致自己会错过很多重要信息,故想写一个爬虫来获取从当前时间之后的新的通知标题,并推送到微信上. PS:推送到微信上这个想法来源是,很多时候都需要将消 ...

随机推荐

  1. android的liveview装载数据

    设置布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:andro ...

  2. PHP中使用cURL

    1.cURL介绍 cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP.FTP.TELNET等.最爽的是,PHP也支持 cURL 库.本文将介绍 cURL 的一些高级特性 ...

  3. 一个页面,多个flash(刚学jq插件)

    只贴js那部分哦 调用 // flash轮播图 var sumF=$('.btnTabs span').length/4; //有四个flash var flashT01=new flash($('. ...

  4. 压力测试之apache benchmark

    ab 的全称是 ApacheBench , 是 Apache 附带的一个小工具 , 专门用于 HTTP Server 的 benchmark testing , 可以同时模拟多个并发请求.前段时间看到 ...

  5. python27读书笔记0.3

    #-*- coding:utf-8 -*- ##D.has_key(k): A predicate that returns True if D has a key k.##D.items(): Re ...

  6. osg 基本几何图元

    转自:osg 基本几何图元 //osg 基本几何图元 // ogs中所有加入场景中的数据都会加入到一个Group类对象中,几何图元作为一个对象由osg::Geode类来组织管理. // 绘制几何图元对 ...

  7. ASP.NET 学习小记 -- “迷你”MVC实现(1)

    ASP.NET 由于采用了管道式设计,具有很好的扩展性.整个ASP.NET MVC应用框架就是通过扩展ASP.NET实现的.通过ASP.NET的管道设计,我们知道,ASP.NET的扩展点主要是体现在H ...

  8. C# Windows Service调用IBM Lotus Notes发送邮件

    近日研究了下IBM Lotus Mail,这货果然是麻烦,由于公司策略,没有开放smtp,很多系统邮件都没有办法发送,于是入手google学习Lotus Mail,想做成Windows服务,提供wcf ...

  9. MJRefreshFooterView

    实例化header和footer _header = [MJRefreshHeaderView header]; _header.scrollView = _tableView; 设置header和f ...

  10. js 字符串扩展

    <script type="text/javascript" language="javascript"> String.prototype.tri ...