AIDL与service

Service:Local service,一个进程中的多线程服务。

AIDL:remote service,不同进程间通信。

Service启动方法:

startService():调用方destroy了那么服务不会销毁,不能与调用方直接适用,不返回任何结果。

bindService():调用方destroy了那么服务也会销毁,能与调用方直接通信。返回Binder。

* bindService时可以传递Binder的形式与调用方直接通信。在调用方需override叫ServiceConnnection的类来与service直接通信。

绑定成功后通过getService()获取Service对象,将Service对象设置为null,表示绑定意外失效,Service实例不再可用。

可以参考一下log:

操作步骤先用startService启动服务,然后destroy。

然后bindService绑定服务,然后destroy的结果如下:

不难看出start方式启动服务时调用方销毁后服务不会自动stop。

而bind方式绑定服务时调用方销毁后服务自动解除绑定同时销毁。

生命周期相关:

AIDL与service的区别

你可以试一试创建两个包不用AIDL的情况。

通过ThreadRandomServiceDemo包中的ThreadRandomServiceDemo类去开启Demo中的RandomService是可以启动的但是无法获取,

有人会说利用bindService()不是利用可以ServiceConnection类返回Binder对象吗?是的,但是你无法加载Demo包(imorpt com.example.demo.RandomService)这样就我们无法与service直接数据交互通信了。

但是我们利用AIDL就可以调用其他进程(或其他project)直接通信。

AIDL是通过MyAidl.Stub.asInterface(binder);来获取binder的。

AIDL是以获取其他进程的接口来实现IPC通信的。

使用AIDL相关可以参考之前讲过的http://www.cnblogs.com/hongguang-kim/p/5165523.html

简单说明一下AIDL问价自动生成的java文件中我们可以看到Parcel。

Parcel是Android系统中应用程序进程间数据传递的容器,能够在两个进程中完成数据的打包和拆包的工作,

但Parcel不同于通用意义上的序列化,Parcel的设计目的是用于高性能IPC传输,因此不能够将Parcel对象保存在任何持久存储设备上。

当数据以Parcel对象的形式传递到跨进程服务的内部时,onTransact()方法将从Parcel对象中逐一的读取每个参数,然后调用Service内部制定的方法,

并再将结果写入另一个Parcel对象,准备将这个Parcel对象返回给远程的调用者。

自定义Parcel:

首先建立AllResult.aidl文件,声明AllResult类

package edu.hrbeu.ParcelMathServiceDemo;
parcelable AllResult;

在第2行代码中使用parcelable声明自定义类,这样其他的AIDL文件就可以使用这个自定义的类

构造AllResult类。AllResult类除了基本的构造函数以外,还需要有以Parcel对象为输入的构造函数,并且需要重载打包函数writeToParcel()
AllResult.java文件的完整代码如下

package edu.hrbeu.ParcelMathServiceDemo;

import android.os.Parcel;
import android.os.Parcelable;

public class AllResult implements Parcelable {
    public long AddResult;
    public long SubResult;
    public long MulResult;
    public double DivResult;
.       public AllResult(long addRusult, long subResult, long mulResult, double divResult){
                              AddResult = addRusult;
        SubResult = subResult;
        MulResult = mulResult;
        DivResult = divResult;
      }

      public AllResult(Parcel parcel) {
        AddResult  = parcel.readLong();
        SubResult  = parcel.readLong();
        MulResult  = parcel.readLong();
        DivResult  = parcel.readDouble();
       }

      @Override
    public int describeContents() {
        return 0;
    }
     @Override
       public void writeToParcel(Parcel dest, int flags) {
                             dest.writeLong(AddResult);34.
        dest.writeLong(SubResult);
        dest.writeLong(MulResult);
        dest.writeDouble(DivResult);
      }

       public static final Parcelable.Creator<AllResult> CREATOR =
        new Parcelable.Creator<AllResult>(){
        public AllResult createFromParcel(Parcel parcel){
            return new AllResult(parcel);
        }
         public AllResult[] newArray(int size){
            return new AllResult[size];
            }
         };
   } 

AllResult类继承于Parcelable
支持通过Parcel对象实例化AllResult内容是构造函数的读取顺序。
writeToParcel()是“打包”函数,将AllResult类内部的数据,按照特定的顺序写入Parcel对象,写入的顺序必须与构造函数的读取顺序一致
静态公共字段Creator,用来使用Parcel对象构造AllResult对象。

我们可以在其他类中编写如下代码:

  long addRusult = a + b;
    long subResult = a - b;
    long mulResult = a * b;
    double divResult = (double) a / (double)b;
    AllResult allResult = new AllResult(addRusult, subResult, mulResult, divResult);

我们可以通过result.AddResult变量获取其运算结果。

时间: 2024-08-10 23:26:11

AIDL与service的相关文章

Android中不使用AIDL实现Service的远程调用

优点:Client端与Server端的DESCRIPTOR可以自定义,不受包名限制 实质中其实是使用底层Binder机制提供的Java层接口 Binder .IInterface等去实现 客户端中使用transact发起进程间通信请求,服务端会回调onTransact来处理请求 Common Interface: public interface ITimeCountService { int getCount() throws RemoteException; } Server: public

解读Android之Service(3)AIDL

本文翻译自android官方文档,结合自己测试,整理如下. Android Interface Definition Language(AIDL)能够让我们定义自己的编程接口,该接口可以使得客户端和service之间进行跨进程通信(interprocess communication,IPC).通常,在android中无法直接跨进程通信.因此,需要把传递的对象分解成系统可以识别的原始状态(数据),并将它们跨进程序列化marshalling.由于marshalling过程繁琐,因此android通

Android studio 中创建AIDL Service

  1.概述  AIDL在android系统中的作用 AIDL,Android Interface definition language的缩写,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口.最近看了下AIDL在Android系统中的用法,在网上看到很多初学的朋友不太明白AIDL的实际作用,android提供了很多进程间通信的组件,像action.broadcast.contentprovide都可以实现进程间的通信,为什么还要用AIDL这个东西呢?我在a

android之了解AIDL

1.什么是AIDL? Android Interface Definition Lauguage(android接口描述语言)是一个IDL语言. 2.AIDL的作用? 背景:在android平台 中,一个进程通常不能访问其它进程中的内存区域.所以,他们需要把对象拆分成操作系统能理解的简单形式,以便伪装成对象跨越边界访问.编写这种伪装代码相当的枯燥乏味,好在android为我们提供了AIDL工具可以来做这件事 作用:用来进行进程间通信,有很多人可能就会问到,进程间通信有很多方法,为什么非要用AID

跨进程绑定Service

之前讲过Service有远程服务,也就是不同程序之间也可以通过Service联系起来.跨进程的绑定Service可以通过aidl接口实现. 下面运用一个例子程序 提供Service里的方法和数据的程序叫做服务端,获取和运用Service里的方法和数据的程序叫客户端. 先创建两个安卓程序,一个作为服务端,一个作为客户端. 先对服务端进行操作,在服务端创建一个class类,然后在我的电脑的eclipse的项目存储目录下,找到该class并把后缀名改为 .aidl 然后回到开发程序中刷新一下,就会发现

Android AIDL开发

Introduction   在Android中, 每个应用程序都运行在自己的进程中,拥有独立的内存空间.但是有些时候我们的应用程序需要跟其它的应用程序进行通信,这个时候该怎么办呢?显然, Java中不允许跨进程内存共享.无法直接交换数据.Android中可以采用AIDL的方式实现进程间通信(interprocess communication(IPC)). Android Developer原文介绍如下:AIDL (Android Interface Definition Language)

AIDL(Android Interface Definition LanguageAndroid接口定义语言)

1.什么是AIDL Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信. 为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用(Remote Procedure Call,RPC)方式来实现.与很多其他的基于RPC的解决方案一样,Android使用一种接口定义语言(Interface Definition Language,IDL)来公开服务的接口.我们知道4个Android应用程序组件中的3个(Activity.Br

Android中远程Service浅析

上一篇文章中简单的写了一下关于Android中Service的两种启动方式,不过都是本地的服务,今天就简单的写下关于Android中远程Service的使用,学习之前先了解两个概念,AIDL( Android Interface definition language)字面上的意思就是借口定义语言,专业一点理解就是Android进程之间通信的借口描述语言.IPC(Inter-Process Conmmunication)内部进程之间的通信,同一个手机上,如果你的APP需要访问调用另外一个APP的

Android基础 ————四大组件之Service

public abstract class Service OverView: A service is an application component representing either an application's desire to perform a long-running operation while not interacting with user or to supply functionality for other applications to use.Eac