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

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. C#基础(五)——类中私有构造函数作用

    如果类成员有private修饰符,就不允许在类范围以外访问这个类成员.对类构造函数应用private修饰符时,则禁止外部类创建该类的实例.尽管看上去有些不好理解(既然不能实例化,那么这个类还有什么用处 ...

  2. 网络请求 post 的接受请求头的代理方法

    接收响应头 content-Length content-Type - (void)connection:(NSURLConnection *)connection didReceiveRespons ...

  3. 洛谷 P1064 金明的预算方案

    题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”.今 ...

  4. POJ3613 Cow Relays [矩阵乘法 floyd类似]

    Cow Relays Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7335   Accepted: 2878 Descri ...

  5. Xcode 调试技巧-b

    随着Xcode 5的发布,LLDB调试器已经取代了GDB,成为了Xcode工程中默认的调试器.它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能.LLDB为Xcode提供了底层调试环 ...

  6. 记一个菜鸟在Linux上部署Tomcat的随笔

    以前都只是在园子里找各种资料.文档.各种抱大腿,今天是第一次进园子里来添砖加瓦,实话说,都不知道整些啥东西上来,就把自己在Linux上搭建Tomcat的过程记录下来,人笨,请各位大虾们勿喷. 虽然做开 ...

  7. yum安装软件时提示软件包没有签名

    yum install [XXX] -y --nogpgcheck

  8. BZOJ 1738: [Usaco2005 mar]Ombrophobic Bovines 发抖的牛

    Description 约翰的牛们非常害怕淋雨,那会使他们瑟瑟发抖.他们打算安装一个下雨报警器,并且安排了一个撤退计划.他们需要计算最少的让所有牛进入雨棚的时间.    牛们在农场的F(1≤F≤200 ...

  9. 客户端动态调用cxf websevice 异常

    三月 30, 2014 10:06:40 上午 org.apache.cxf.common.jaxb.JAXBUtils logGeneratedClassNames 信息: Created clas ...

  10. Spring+MyBatis实践—登录和权限控制

    1.实现用户登录功能: 通过session来实现用户登录功能.在用户登录时,将用户的相关信息放在HttpSession对象用,其中HttpSession对象可以通过HttpServletRequest ...