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

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. day93之微信推送

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

  2. Android线程的创建与销毁

    摘要: 在Android开发中经常会使用到线程,一想到线程,很多同学就立即使用new Thread(){...}.start()这样的方式.这样如果在一个Activity中多次调用上面的代码,那么将创 ...

  3. python 微信推送模板消息

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

  4. python使用微信推送消息

    from wxpy import * #该库主要是用来模拟与对接微信操作的 import requests from datetime import datetime import time impo ...

  5. java-给微信推送消息 利用企业微信

    目的:给关注用户推送消息 场景:自动化测试,运维监控,接口访问等报错预警.例如线上接口报错,发送提醒消息 准备工作: 1:注册企业号(为什么不用公众号呢?) 企业号注册 2:常用参数介绍: 1:COR ...

  6. 极光推送配置(Android Studio),亲测有效

    进行到这里就可以接收到通知了,但是如果你还想根据接收的消息做点什么 step8: public class MyReceiver extends BroadcastReceiver { private ...

  7. Server酱微信推送中的问题

    1.写在URL的文字就是不在微信端显示 当时为了明显提示写了个这个:<--11111-->后来发现1111不能显示,去掉两边的<---->就可以了, 2.输出到微信端的文字不换 ...

  8. node-wechat 微信推送消息

    https://github.com/nswbmw/node-wechat/blob/master/index.js

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

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

随机推荐

  1. ABP dynamic API

    打开ABP的事例项目SimpleTaskSystem.WebSpaAngular 中LayoutView <!-- Dynamic scripts of ABP system (They are ...

  2. TortoiseGit 连接Git服务器不用每次输入用户名和密码的方法

    每次git push 都要输入用户名和密码. 虽然安全,但在自己电脑上每次都输有些麻烦,如何记住用户名和密码呢? 试了很多方法,找到这个最简单,亲测可行. 当你配置好git后,在C盘C:\Users\ ...

  3. excel怎么固定第一行

    这里给大家介绍一下怎么固定表格的第一行,或者说怎么固定表格的表头. 1.我这里有一个成绩表,希望固定住其第一行. 2.选择单元格A2 注意:你只需要选择所要固定行的下一行的任一单元格即可!!! 3.然 ...

  4. linux 配置java 环境

    下载jdk 并解压到 /usr/local/java/ 目录下 地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-down ...

  5. prototype与原型链

    1.今天翻看 阮一峰老师的博客看到了,一篇讲javascript为什么要设计出prototype,跳转      大意就是new 的方式有缺陷,没有共同的属性,一下明白了很多. 在来一张原型链的图:

  6. GridView第一个Item中的CheckBox不工作

    问题:如题 解决办法: 修改后: ViewGroup.LayoutParams params =helper.getConvertView().getLayoutParams(); params.wi ...

  7. linux命令行下导出导入.sql文件

    一.导出数据库用mysqldump命令(注意mysql的安装路径,即此命令的路径):1.导出数据和表结构(以管理员身份运行): ------------------------------------ ...

  8. Dictionary带来的一种隐式内存泄漏

    当心Dictionary带来的一种隐式内存泄漏 最近在看Dictionary的源代码的时候, 突然想到Dictionary的不当使用中有一种隐含内存泄漏的可能. 简化使用场景 小A正在写一个简单的图书 ...

  9. 当Erlang遇到Solr

    当Erlang遇到Solr   Joe Armstrong的访谈中有一段关于"打开黑盒子"的阐述,给我留下很深的印象:Joe Armstrong在做XWindows开发时没有使用对 ...

  10. http://codeforces.com/contest/612/problem/D

    D. The Union of k-Segments time limit per test 4 seconds memory limit per test 256 megabytes input s ...