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变量获取其运算结果。
AIDL与service的更多相关文章
- Android studio 中创建AIDL Service
1.概述 AIDL在android系统中的作用 AIDL,Android Interface definition language的缩写,它是一种android内部进程通信接口的描写叙述语言, ...
- 一个简单的demo学习Android远程Service(AIDL的使用)
这是milo很早之前写在论坛上的一个帖子,现在整理出来,milo也复习一下一般来说Android 的四大组件都是运行在同一个进程中的,但远程Service运行在不同的进程里.这进程间的通信是使用了An ...
- 了解AIDL
1.什么是AIDL? Android Interface Definition Lauguage(android接口描述语言)是一个IDL语言. 2.AIDL的作用? 背景:在android平台 中, ...
- 安卓中AIDL的使用方法快速入门
1.AIDL是什么? AIDL全称是Android Interface Definition Language,即安卓接口定义语言. 2.AIDL是用来做什么的?(为什么要有AIDL) AIDL是用来 ...
- Android service ( 二) 远程服务
通常每个应用程序都在它自己的进程内运行,但有时需要在进程间传递对象,你可以通过应用程序UI的方式写个运行在一个不同的进程中的service.在android平台中,一个进程通常不能访问其他进程中的内存 ...
- Android四大组件之Service
Android四大组件之Service Android支持服务的概念,服务是在后台运行的组件,没有用户界面,Android服务可用有与活动独立的生命周期.Android支持两种类型的服务: 本地服务: ...
- 九 AIDL
多进程 多线程 优点 安全 稳定 扩大内存空间 节约CPU时间 AIDL=Android Interface definition language 使用情况:做一个下载,不想让你的下载拖垮你 ...
- AIDL与stub
Stub翻译成中文是存根的意思,注意Stub对象是在被调用端进程,也就是服务端进程,至此,服务端aidl服务端得编码完成了. stub是为了方便client,service交互而生成出来的代码.A ...
- 安卓组件service
[转]http://blog.csdn.net/ithomer/article/details/7364024 一. Service简介 Service是android 系统中的四大组件之一(Acti ...
随机推荐
- java多态例子
多态存在的三个必要条件一.要有继承:二.要有重写:三.父类引用指向子类对象. 代码部分: class A { public String show(D obj) { return ("A a ...
- 手游设备ID
android: imei: IMEI(International Mobile Equipment Identity)是国际移动设备标识的缩写,IMEI由15位数字(英文字母)组成. mac: 是指 ...
- ubuntu下,apt的参数使用,很实用呦
ubuntu下apt-get 命令参数 常用的APT命令参数 apt-cache search package 搜索包 apt-cache show package 获取包的相关信息,如说明.大小.版 ...
- ERS-2卫星
ERS-2卫星是欧洲空间局的第二颗资源遥感卫星,携带有雷达测高仪.综合孔径雷达等多种科学仪器,是一颗多任务.多学科的科学考察卫星.[1] ERS-1 ERS-2 欧空局分别于1991年和1995年发射 ...
- 尝试自己建立以alpine 为基础的docker基础镜像和组件镜像
安装ubuntu14.04 然后 #获取root权限 sudo su #安装docker apt-get install docker #准备基础镜像 docker pull alpine docke ...
- 用pxe启动iso光盘里的pe
用pxe启动iso光盘里的pe 我不是个运维,所以pxe我是由于一台比较老的笔记本不能u盘启动.光驱又坏了的情况下,硬盘上的系统在我不小心下...ghostexp解压ghost文件到c盘的时候,c盘是 ...
- 入门学习PHP之变量_1
1.函数里只能访问局部变量,不能访问全局变量,如果函数里需要访问全局变量则需要在变量前加global作用域,如下实例: <?php $x=5; $y=10; function myTest() ...
- Datatable导出Excel
; IRow headerRow = sheet.CreateRow(); ; ; ; iRowIndex++; } ; i < icolIndex; i++) { sheet.AutoSize ...
- hbase基本结构
HBASE 基本结构一.overview1. hbase <=> NOSQL 不错,hbase 就是某种类型的nosql 数据库,唯一的区别就是他支持海量的数据. hbas ...
- [my]_ubuntu12.10_/etc/apt/sources.list
deb http://mirrors.163.com/ubuntu/ precise main universe restricted multiverse deb-src http://mirror ...