zoukankan      html  css  js  c++  java
  • android学习笔记57——Service_2

    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中,只要一个类extendsjava.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之外,其他类型全部需要添加引用(导入包引用),即使在同一个包中也需要导包。

  • 相关阅读:
    Java 泛型学习四 自动擦除
    Java 泛型学习三 通配符
    ava的动态性支持学习七 方法句柄调用的性能对比
    Java 泛型学习一 泛型概念
    Java中正则Matcher类的matches()、lookAt()和find()的区别
    Java 泛型学习五 泛型擦除带来的不自然
    Java I/O 流的简单介绍及示例
    Java 泛型学习二 泛型的限制
    Java 泛型学习六 泛型类型系统
    字节存储机制:bigedian 和 littleendian
  • 原文地址:https://www.cnblogs.com/YYkun/p/5999679.html
Copyright © 2011-2022 走看看