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 ...
随机推荐
- socket学习笔记——IO口的基本操作(读、写)
写操作 1 #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unist ...
- Android之Handler(异步消息处理)机制
1. 概述 Handler . Looper .Message 这三者都与Android异步消息处理线程相关的概念.那么什么叫异步消息处理线程呢?异步消息处理线程启动后会进入一个无限的循环体之中,每循 ...
- bzoj1433: [ZJOI2009]假期的宿舍
1433: [ZJOI2009]假期的宿舍 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2286 Solved: 969[Submit][Stat ...
- AX 的 NumberSequences
EG: 在库存模块新加一个numberSequences. 1. 新加一个EDT\ SML_Test1; 2. 在库存模块的 class\NumberSeqReference_Inventory\Lo ...
- 图解Windows Server 2012 桌面图标
显示桌面图标.壁纸等 1 WIN键+R键,输入: rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0 选择你需要的图标显示到桌面去,如下图所示 ...
- 使用py2exe打包你的py程序
软件环境:python3.3.4 + PyQt5 使用py2exe打包写好的py文件,过程如下: 在你要打包的代码文件(比如sample.py)的同文件夹建立一个python代码文件(比如setup. ...
- Linux之通配符与转义字符
通配符: *:代表任意字符,可以为空字符 ?:代表一个字符,不可以为空字符 转义字符: \
- Android带返回值的窗口跳转
1.AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest ...
- trap在shell中捕捉信号
一.trap捕捉到信号之后,可以有三种反应方式:(1)执行一段程序来处理这一信号(2)接受信号的默认操作(3)忽视这一信号 二.trap对上面三种方式提供了三种基本形式:第一种形式的trap命令在sh ...
- Min Stack [LeetCode 155]
1- 问题描述 Design a stack that supports push, pop, top, and retrieving the minimum element in constant ...