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

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. python 微信推送模板消息

    #!/usr/bin/env python #-*- coding: utf-8 -*- import httplib import json import MySQLdb #从数据库中获取acces ...

  2. Android: Service中创建窗口显示

    WindowManager.LayoutParams: int TYPE_SYSTEM_ALERT  Window type: system window, such as low power ale ...

  3. Android、iOS和Windows Phone中的推送技术

    推送并不是什么新技术,这种技术在互联网时代就已经很流行了.只是随着进入移动互联网时代,推送技术显得更加重要.因为在智能手机中,推送从某种程度上,可以取代使用多年的短信,而且与短信相比,还可以向用户展示 ...

  4. 【android极光推送】—从客户端到后台,一文通吃

    sion android:name="android.permission.VIBRATE" /> <uses-permission android:name=&quo ...

  5. Android消息推送完美解决方案全析

    推送功能在手机应用开发中越来越重要,已经成为手机开发的必须.在Android应用开发中,由于众所周知的原因,Android消息推送我们不得不大费周折.本文就是用来和大家共同探讨一种Android消息推 ...

  6. 极光推送使用实例(二) Android客户端

    上一篇简单介绍了极光推送在Java服务端的实现,如果感兴趣的可以看一下极光推送使用实例(一)JAVA服务端.这篇文章介绍下极光推送在Android客户端的实现. JPush Android SDK 是 ...

  7. 【Android应用开发】 推送原理解析 极光推送使用详解 (零基础精通推送)

    作者 : octopus_truth 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/45046283 推送技术产生场景 : -- ...

  8. Android之使用个推实现三方应用的推送功能

    PS:用了一下个推.感觉实现第三方应用的推送功能还是比较简单的.官方文档写的也非常的明确. 学习内容: 1.使用个推实现第三方应用的推送.      所有的配置我最后会给一个源代码,内部有相关的配置和 ...

  9. Android 推送实现

    解决数据同步的问题:常用的方法有2种. (1) 定时去服务器上查询数据,也叫Polling. (2) 手机跟服务器之间维护一个 TCP 长连接,或者使用SMS,当服务器有数据时,实时推送到客户端,也就 ...

随机推荐

  1. Linux ls

    linux.ls linux ls命令, 我觉得是所有接触linux系统, 首先学习的命令. 这个命令, 我也早就接触过了. 只是以前是学习类型的. 学了以后, 没有做到学以致用.可惜了. 现在这篇内 ...

  2. PhoneGap初试!

    最近公司准备开发一个移动应用,方便起见准备开发web项目,用PhoneGap打包成iOS与Android平台的应用.对PhoneGap完全不了解,所以先装个试下.折腾了大半天,总算弄出点儿眉目,整理下 ...

  3. [转]为什么我要用 Node.js? 案例逐一介绍

    原文地址:http://blog.jobbole.com/53736/ 介绍 JavaScript 高涨的人气带来了很多变化,以至于如今使用其进行网络开发的形式也变得截然不同了.就如同在浏览器中一样, ...

  4. Unity2D 之 Sprite点击事件

    以下方法纯属我YY,切勿当真!!! 给 Sprite添加点击事件步骤: 1. 创建一个 Sprite 2. 给Sprite添加一个 Box Collider 2D 3. 将如果脚本放到Sprite上: ...

  5. hdoj 5003

    题意:给你一个数组a,降序排序后,求sum+=0.95^(i-1)*ai 这题wa了两发,因为我没看清题意,要排序! 精度上面通过a^(i-1)=e^((i-1)*log(a)) 提到精度,就要想到底 ...

  6. Android 之 自动匹配字符AutoCompleteTextView

    AutoCompleteTextView是自动匹配字符,当我们输入一个单词或一段话的前几个字时,就会自动为你匹配后面的内容看效果图: 下面是代码: MainActivit: package com.e ...

  7. 打开了chrome审查元素 发现报错 Uncaught SyntaxError: Unexpected token )

    这个错误并不影响业务处理,但是看到有报错,心里总是不爽. 经过几番查找,发现了原因. <a href="javascript:void()" oncick="onS ...

  8. 【原创】Algorithms:原地归并排序

    第一次归并: a[0] a[1] a[2] a[3] a[4] a[5] a[6] 23 8 19 33 15 6 27 ↑             ↑ i     j 最开始i指向a[0],j指向a ...

  9. P2P金融

    P2P金融又叫P2P信贷,是互联网金融(ITFIN)的一种.意思是:点对点. P2P金融指不同的网络节点之间的小额借贷交易(一般指个人),需要借助电子商务专业网络平台帮助借贷双方确立借贷关系并完成相关 ...

  10. C# - ref &amp; out

    引用参数和值参数 值参数,是在函数中此变量的任何修改都不影响函数调用中指定的参数,除非把它当作返回值返回,经典例子,交换两个数,但是返回值只有一个. 此时可以用引用参数,函数处理的变量和函数调用中使用 ...