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的更多相关文章

  1. Android studio 中创建AIDL Service

      1.概述  AIDL在android系统中的作用 AIDL,Android Interface definition language的缩写,它是一种android内部进程通信接口的描写叙述语言, ...

  2. 一个简单的demo学习Android远程Service(AIDL的使用)

    这是milo很早之前写在论坛上的一个帖子,现在整理出来,milo也复习一下一般来说Android 的四大组件都是运行在同一个进程中的,但远程Service运行在不同的进程里.这进程间的通信是使用了An ...

  3. 了解AIDL

    1.什么是AIDL? Android Interface Definition Lauguage(android接口描述语言)是一个IDL语言. 2.AIDL的作用? 背景:在android平台 中, ...

  4. 安卓中AIDL的使用方法快速入门

    1.AIDL是什么? AIDL全称是Android Interface Definition Language,即安卓接口定义语言. 2.AIDL是用来做什么的?(为什么要有AIDL) AIDL是用来 ...

  5. Android service ( 二) 远程服务

    通常每个应用程序都在它自己的进程内运行,但有时需要在进程间传递对象,你可以通过应用程序UI的方式写个运行在一个不同的进程中的service.在android平台中,一个进程通常不能访问其他进程中的内存 ...

  6. Android四大组件之Service

    Android四大组件之Service Android支持服务的概念,服务是在后台运行的组件,没有用户界面,Android服务可用有与活动独立的生命周期.Android支持两种类型的服务: 本地服务: ...

  7. 九 AIDL

      多进程 多线程 优点 安全 稳定 扩大内存空间 节约CPU时间 AIDL=Android Interface definition language   使用情况:做一个下载,不想让你的下载拖垮你 ...

  8. AIDL与stub

     Stub翻译成中文是存根的意思,注意Stub对象是在被调用端进程,也就是服务端进程,至此,服务端aidl服务端得编码完成了.  stub是为了方便client,service交互而生成出来的代码.A ...

  9. 安卓组件service

    [转]http://blog.csdn.net/ithomer/article/details/7364024 一. Service简介 Service是android 系统中的四大组件之一(Acti ...

随机推荐

  1. socket学习笔记——IO口的基本操作(读、写)

    写操作 1 #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unist ...

  2. Android之Handler(异步消息处理)机制

    1. 概述 Handler . Looper .Message 这三者都与Android异步消息处理线程相关的概念.那么什么叫异步消息处理线程呢?异步消息处理线程启动后会进入一个无限的循环体之中,每循 ...

  3. bzoj1433: [ZJOI2009]假期的宿舍

    1433: [ZJOI2009]假期的宿舍 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2286  Solved: 969[Submit][Stat ...

  4. AX 的 NumberSequences

    EG: 在库存模块新加一个numberSequences. 1. 新加一个EDT\ SML_Test1; 2. 在库存模块的 class\NumberSeqReference_Inventory\Lo ...

  5. 图解Windows Server 2012 桌面图标

    显示桌面图标.壁纸等   1 WIN键+R键,输入:  rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0 选择你需要的图标显示到桌面去,如下图所示 ...

  6. 使用py2exe打包你的py程序

    软件环境:python3.3.4 + PyQt5 使用py2exe打包写好的py文件,过程如下: 在你要打包的代码文件(比如sample.py)的同文件夹建立一个python代码文件(比如setup. ...

  7. Linux之通配符与转义字符

    通配符: *:代表任意字符,可以为空字符 ?:代表一个字符,不可以为空字符 转义字符: \

  8. Android带返回值的窗口跳转

    1.AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest ...

  9. trap在shell中捕捉信号

    一.trap捕捉到信号之后,可以有三种反应方式:(1)执行一段程序来处理这一信号(2)接受信号的默认操作(3)忽视这一信号 二.trap对上面三种方式提供了三种基本形式:第一种形式的trap命令在sh ...

  10. Min Stack [LeetCode 155]

    1- 问题描述 Design a stack that supports push, pop, top, and retrieving the minimum element in constant ...