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 ...
随机推荐
- AudioPlayer.js,一个响应式且支持触摸操作的jquery音频插件
AudioPlayer.js是一个响应式.支持触摸操作的HTML5 的音乐播放器.本文是对其官网的说用说明文档得翻译,博主第一次翻译外文.不到之处还请谅解.之处. JS文件地址:http://osva ...
- 异常System.Web.HttpException (0x80004005): Server cannot set status after HTTP headers have been sent.
在用mvc 的AuthorizeAttribute做身份验证,重写HandleUnauthorizedRequest方法,在Application_Error方法里出现异常System.Web.Htt ...
- MySQL 按日期分表
一.表不存在时则创建 之前做项目实在是太赶了,很多东西都没记录.是时候补回来了 MySQL做一个大表,由于要存历史记录,所以数据量很大,查询很慢.恰好查询的时候,又不需要时间太久的冷数据.现在将其实现 ...
- JS与JQ倒计时的写法
页面需要制作一个倒计时的功能:然后度娘了一遍,找到两种写法,原生JS与JQ 的,经过测试原生JS在IE可能会有不刷新的现象所以结合了一个大神的JQ写法修改好了一个. 原生JS写法: HTML: < ...
- webstorm & phpstorm破解
webstorm: http://idea.qinxi1992.cn/ http://idea.goxz.gq http://v2mc.net:1017 http://idea.imsxm.com h ...
- Solaris从安装光盘安装软件
系统安装完成后默认没有安装GCC 挂载系统盘后,所安装的软件就在/cdrom/sol-10-811-x86/Solaris_10/Product文件夹下可以查看下关于GCC的软件包 #ls -l | ...
- linux常见驱动修改
=============================== 说明 ===============================本文以A5为例,举8种我们公司常用接口的极度精简的驱动程序,只宜参考 ...
- 双人对战的球类游戏IOS源码
双人对战的球类游戏源码,这个是一款双人对战的ios球类游戏源码,游戏的源码也比较详细的,我们在屏幕上下看到各有一个球门,内有一球,两边通过控制轮盘使球进入对方的球门的,其实玩法也很简单的,我们知道体育 ...
- javac 不是内部或外部命令
安装好JDK后 用 java 命令测试OK! 用 java -version 命令测试OK! 用 javac ...
- ASP.NET中@Page指令中的AutoEventWireup
AutoEventWireup:指示控件的事件是否自动匹配 (Autowire).如果启用事件自动匹配,则为 true:否则为 false.默认值为 true.如果设为false,则事件不可用.有关更 ...