Service生命周期

参考:http://codingnow.cn/android/515.html

应用程序启动服务的方式不同,其生命周期也有所不同。

startService生命周期如下左图:

bindService生命周期如下右图:

context.startService() ->onCreate()- >onStartCommand()->Service running--调用context.stopService() ->onDestroy()

context.bindService()->onCreate()->onBind()->Service running--调用>onUnbind() -> onDestroy()

startService():一般用于在后台上传文件或者下载文件等,不跟其他组件通信,就算启动它的应用被销毁了,它仍然会欢快的在后台执行,直到完成任务的时候自刎(自己调用stopSelf())或者被其他人下黑手(调用stopService()).

bindService():允许其他组件跟它进行通信,允许多个客户端绑定到同一个service上,当所有的客户端都解除绑定后,该service就销毁了。

service和线程的区别

刚开始接触service的时候,很多人会有这样的疑问,为什么不用thread代替service呢。首先得明白本地service是运行在主进程的main线程上的,如果是远程service,则运行在独立进程的main线程上。

而新建线程主要是用来执行一些异步的操作。首先从生命周期来分析,当一个应用程序被强制终止后,应用程序中开启的线程也会被销毁,而service可以做到在应用被终止的情况下仍然在后台欢快的运行。

其次是同一个线程对象没法被多个activty控制,如有时候会出现这种情况:当 Activity 被 finish 之后,该Activty启动的线程还在执行,此时你失去了对该线程的引用,只能通过终止应用来停止该线程的运行。

对于一些比较关键的服务,一般选择使用service,如果比较耗时则可以在service中创建和控制线程,进行异步操作。

跨进程调用服务(AIDL服务)

android系统中各个应用程序都是运行在自己的进程中,进程直接一般无法直接进行数据交换。

在过去的技术实现中,Corba可实现跨进程的调用;java技术中RMI也可实现跨进程调用;Android系统中,跨进程调用Service的方式与此基本相似。

Corba==>

CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构,通用对象请求代理体系结构)是由OMG组织制订的一种标准的面向对象应用程 序体系规范。或者说 CORBA体系结构是对象管理组织(OMG)为解决分布式处理环境(DCE)中,硬件和软件系统的互连而提出的一种解决方案;OMG组织是一个国际性的非盈利组织,其职责是为应用开发提供一个公共框架,制订工业指南和对象管理规范,加快对象技术的发展。

RMI==>

http://haolloyin.blog.51cto.com/1177454/332426/

RMI(即Remote Method Invoke 远程方法调用)。在Java中,只要一个类extends了java.rmi.Remote接口,即可成为存在于服务器端的远程对象,供客户端访问并提供一定的服务。JavaDoc描述:Remote 接口用于标识其方法可以从非本地虚拟机上调用的接口。任何远程对象都必须直接或间接实现此接口。只有在“远程接口”(扩展 java.rmi.Remote 的接口)中指定的这些方法才可远程使用。

......

AIDL 服务简介

AIDL==> Android Interface definition language,是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口。

Android的远程Service调用与Java的RMI基本相似,一样都是先定义一个远程调用接口,然后为该接口提供一个实现类即可。

与RMI不同的是,客户端访问Service时,android并不是直接返回Service对象给客户端——这一点绑定本地服务就可看到,Service只是将一个回调对象IBinder对象通过onBind()返回给客户端。

因此Android AIDL远程接口的实现类就是那个IBinder实现类。

与绑定本地服务不同的是,本地服务的onBind()回直接把IBinder对象本身传给客户端的ServiceConnection的onServiceConnneted方法的第二个参数;

但远程服务的onBind()只是将IBinder对象的代理传给客户端的ServiceConnection的onServiceConnected方法的第二个参数。

当客户端获取到远程服务的IBinder对象的代理之后,即可通过IBinder对象去回调远程服务的属性或者方法了。

注意:

Android需要AIDL,android interface definition language,来定义远程接口。其只是定义两个进程之间的通信接口。

AIDL语法与Java语句相似,但存在如下差异:

1.AIDL定义接口的源代码必须以.aidl结尾;

2.AIDL接口中用到的数据类型,处理基本类型、String、List、Map、CharSequence之外,其他类型全部需要添加引用(导入包引用),即使在同一个包中也需要导包。

android学习笔记57——Service_2的更多相关文章

  1. android学习笔记57——电话管理器TelephoneyManager

    电话管理器TelephoneyManager

  2. Android 学习笔记之Volley(七)实现Json数据加载和解析...

    学习内容: 1.使用Volley实现异步加载Json数据...   Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后 ...

  3. Android学习笔记进阶之在图片上涂鸦(能清屏)

    Android学习笔记进阶之在图片上涂鸦(能清屏) 2013-11-19 10:52 117人阅读 评论(0) 收藏 举报 HandWritingActivity.java package xiaos ...

  4. android学习笔记36——使用原始XML文件

    XML文件 android中使用XML文件,需要开发者手动创建res/xml文件夹. 实例如下: book.xml==> <?xml version="1.0" enc ...

  5. Android学习笔记之JSON数据解析

    转载:Android学习笔记44:JSON数据解析 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种 ...

  6. udacity android 学习笔记: lesson 4 part b

    udacity android 学习笔记: lesson 4 part b 作者:干货店打杂的 /titer1 /Archimedes 出处:https://code.csdn.net/titer1 ...

  7. Android学习笔记36:使用SQLite方式存储数据

    在Android中一共提供了5种数据存储方式,分别为: (1)Files:通过FileInputStream和FileOutputStream对文件进行操作.具体使用方法可以参阅博文<Andro ...

  8. Android学习笔记之Activity详解

    1 理解Activity Activity就是一个包含应用程序界面的窗口,是Android四大组件之一.一个应用程序可以包含零个或多个Activity.一个Activity的生命周期是指从屏幕上显示那 ...

  9. Pro Android学习笔记 ActionBar(1):Home图标区

     Pro Android学习笔记(四八):ActionBar(1):Home图标区 2013年03月10日 ⁄ 综合 ⁄ 共 3256字 ⁄ 字号 小 中 大 ⁄ 评论关闭 ActionBar在A ...

随机推荐

  1. iOS开发UI篇—使用UItableview完成一个简单的QQ好友列表(二)

    一.实现效果             二.实现代码 1.数据模型部分 YYQQGroupModel.h文件 // // YYQQGroupModel.h // 02-QQ好友列表(基本数据的加载) / ...

  2. codeforces 451D Count Good Substrings

    题意:给定一个字符串,求有多少个奇数子串和多少偶数子串为 “回文串”   这边回文串很特殊之含有  ab  两种字母  而且  相邻的字母相同则消去一个  一直到不存在相邻的相同. 思路:  在这种串 ...

  3. Sharepoint的javascript客户端对象模型获取其他站点的list

    获取当前站点(子站点而不是站点集)下的list var clientContext = new SP.ClientContext.get_current(); var list=clientConte ...

  4. java 自带md5加密

    package test; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; pub ...

  5. 黑马程序员——【Java基础】——File类、Properties集合、IO包中的其他类

    ---------- android培训.java培训.期待与您交流! ---------- 一.File类 (一)概述 1.File类:文件和目录路径名的抽象表现形式 2.作用: (1)用来将文件或 ...

  6. 基于Twemproxy的Redis集群搭建以及想法

    基于Twemproxy的Redis集群方案(转) redis3.0 已经发布了几个月了,但是我这等菜鸟到网上还是没有找到很好的关于搭建redis3.0集群的文章,而且好像很多公司的redis版本还保持 ...

  7. Maven工程中的右键team

    与资源库同步(S):在需要合并版本时使用 提交(C):本地代码写入源码库 更新(U):本地代码升级到服务器端版本 在点击更新时,请注意: 如果当前项目有改动(甚至是比原来多了一个空格),则此时无法更新 ...

  8. Jquery和Javascript 实际项目中写法基础-闭包 (2)

    一.什么是闭包? 概念性的我就不去百度了,感兴趣的可以自己去搜下,我自己的理解,闭包就是一个封装的包,相当于类的概念,把乱七八糟的的东西封装到一起,然后统一使用一个对象来调用,实现代码部分对外开放,部 ...

  9. java中Timer的使用

    // 第一种方法:设定指定任务task在指定时间time执行后执行TimerTask方法(执行一次) public static void timer1(){ Timer timer = new Ti ...

  10. VS 2010 编译 Openssl

    VS 2010 编译 Openssl 1. 编译环境: Visual Studio 2010 Windows 7 64 旗舰版 openssl-1.0.1s 2. 下载安装ActivePerl,下载下 ...