android parcelableandroid是什么手机数据类型?

Android&Bundle类介绍以及应用
Bundle类是一个final类,其功能是“A mapping from String values to
various Parcelable
types.”,也就是说是一个存储和管理key-value对的类,多应用于Activity之间相互传递值
1 public Bundle ()
功能:构造一个新的,空束。
2 public Bundle (ClassLoader loader)
功能:构造一个新的空包,使用一个特定的ClassLoader实例Parcelable和Serializable对象。
3 public Bundle (int capacity)
功能:构造一个新的,空束大小举行的元素数量。
参数:捆绑的初始容量
4 public Bundle (Bundle b)
功能:构造一个包,包含给定包的映射的副本。
参数:要复制的捆绑Parameters
b& a Bundle to be copied.&
1 public void clear ()
功能:从这种捆绑的映射中移除所有元素。
2 public boolean containsKey (String key)
功能:如果给定的关键是在这种捆绑的映射中,则返回true。
参数:一个字符串键
3 public int describeContents ()
功能:报告Parcelable的内容的性质
参数:一个位掩码,表示一套特殊的对象类型编组的Parcelable。
4 public Object get (String key)
功能:返回与给定键的对象的入口。
参数:一个字符串键
5 public boolean getBoolean (String key)
功能:返回与给定的密钥,或默认值相关联的,如果没有所需的类型的映射关系,给定键的存在值。
6 public boolean getBoolean (String key, boolean
defaultValue)
功能:回与给定的密钥,或默认值相关联的,如果没有所需的类型的映射关系,给定键的存在值
7 public boolean[] getBooleanArray (String key)
功能:返回与给定的密钥,或者为null,如果没有所需的类型映射为给定的密钥或一个空值是明确与该键关联的存在值。
8 public Bundle getBundle (String key)
功能:返回与给定的密钥,或者为null,如果没有所需的类型映射为给定的密钥或一个空值是明确与该键关联的存在值。
9 public byte getByte (String key)
功能:返回给定的密钥,或(字节)0,如果没有所需的类型的映射关系,给定键的存在价值。参数
10 public Byte getByte (String key, byte
defaultValue)
功能:返回与给定的密钥,或默认值相关联的,如果没有所需的类型的映射关系,给定键的存在值。参数
11 public byte[] getByteArray (String key)
功能:返回与给定的密钥,或者为null,如果没有所需的类型映射为给定的密钥或一个空值是明确与该键关联的存在值。
12 public char getChar (String key)
功能:返回与给定的密钥,或虚假的关联,如果没有所需的类型的映射关系,给定键的存在值。
13 public char getChar (String key, char
defaultValue)
功能:返回与给定键关联的值,或(char)的0,如果没有所需的类型映射给定键的存在。
14 public char[] getCharArray (String key)
功能:返回与给定的密钥,或者为null,如果没有所需的类型映射为给定的密钥或一个空值是明确与该键关联的存在值。
15 public CharSequence getCharSequence (String key,
CharSequence
16 public CharSequence getCharSequence (String key)
17 public CharSequence[] getCharSequenceArray (String
功能:返回与给定的密钥,或者为null,如果没有所需的类型映射为给定的密钥或一个空值是明确与该键关联的存在值。
ArrayList&CharSequence&
getCharSequenceArrayList (String key)
功能:返回与给定的密钥,或者为null,如果没有所需的类型映射为给定的密钥或一个空值是明确与该键关联的存在值。
19 public ClassLoader getClassLoader ()
功能:返回当前这种捆绑关联的ClassLoader。
20 public double getDouble (String key)
功能:返回给定的密钥,或0.0,如果没有所需的类型的映射关系,给定键的存在值。
21 public double getDouble (String key, double
defaultValue)
功能:返回与给定的密钥,或默认值相关联的,如果没有所需的类型的映射关系,给定键的存在值。
22 public double[] getDoubleArray (String key)
功能:返回与给定的密钥,或者为null,如果没有所需的类型映射为给定的密钥或一个空值是明确与该键关联的存在值。
23 public float getFloat (String key)
功能:返回与给定的密钥,或0.0f相关,如果没有所需的类型的映射关系,给定键的存在的值。
24 public float getFloat (String key, float
defaultValue)
功能:返回与给定的密钥,或默认值相关联的,如果没有所需的类型的映射关系,给定键的存在值。
25 public float[] getFloatArray (String key)
功能:返回与给定的密钥,或者为null,如果没有所需的类型映射为给定的密钥或一个空值是明确与该键关联的存在值。
26 public int getInt (String key, int defaultValue)
27 public int getInt (String key)
28 public int[] getIntArray (String key)
29 public ArrayList&Integer&
getIntegerArrayList (String key)
30 public long getLong (String key)
31 public long getLong (String key, long
defaultValue)
32 public long[] getLongArray (String key)
33 public T getParcelable (String key)
34 public Parcelable[] getParcelableArray (String
35 public ArrayList&T&
getParcelableArrayList (String key)
36 public Serializable getSerializable (String key)
37 public short getShort (String key)
38 public short getShort (String key, short
defaultValue)
39 public short[] getShortArray (String key)
40 public SparseArray&T&
getSparseParcelableArray (String key)
41 public String getString (String key, String
defaultValue)
42 public String getString (String key)
43 public String[] getStringArray (String key)
44 public ArrayList&String&
getStringArrayList (String key)
45 public boolean hasFileDescriptors ()
46 public boolean isEmpty ()
47 public Set&String& keySet
48 public void putAll (Bundle map)
功能:从这种捆绑捆绑插入的所有映射。
49 public void putBoolean (String key, boolean value)
功能:插入一个布尔值,这个捆绑的映射取代任何现有的值给定键。无论是键或值可能为空
50 public void putBooleanArray (String key, boolean[]
功能:布尔数组插入到这个包的映射值,给定键的替换任何现有的值。无论是键或值可能为空。
51 public void putBundle (String key, Bundle value)
功能:插入到这个包的映射束值,给定键的替换任何现有的值。无论是键或值可能为空。
52 public void putByte (String key, byte value)
53 public void putByteArray (String key, byte[]
54 public void putChar (String key, char value)
55 public void putCharArray (String key, char[]
56 public void putCharSequence (String key, CharSequence
57 public void putCharSequenceArray (String key,
CharSequence[] value) 功能:
58 public void putCharSequenceArrayList (String key,
ArrayList&CharSequence&
功能:插入一个ArrayList值映射到这个捆绑的,给定键的替换任何现有的值。无论是键或值可能为空。
59 public void putDouble (String key, double value)
60 public void putDoubleArray (String key, double[]
61 public void putFloat (String key, float value)
62 public void putFloatArray (String key, float[]
63 public void putInt (String key, int value)
64 public void putIntArray (String key, int[] value)
65 public void putIntegerArrayList (String key,
ArrayList&Integer& value)
66 public void putLong (String key, long value)
67 public void putLongArray (String key, long[]
68 public void putParcelable (String key, Parcelable
69 public void putParcelableArray (String key, Parcelable[]
功能:插入到这个包的映射Parcelable值,给定键的替换任何现有的值。无论是键或值可能为空。
70 public void putParcelableArrayList (String key,
ArrayList&? extends Parcelable&
value) 功能:
71 public void putSerializable (String key, Serializable
功能:这种捆绑的映射插入到序列化的值,给定键的替换任何现有的值。无论是键或值可能为空。
72 public void putShort (String key, short value)
73 public void putShortArray (String key, short[]
74 public void putSparseParcelableArray (String key,
SparseArray&? extends Parcelable&
75 public void putString (String key, String value)
76 public void putStringArray (String key, String[]
77 public void putStringArrayList (String key,
ArrayList&String& value)
78 public void readFromParcel (Parcel parcel)
79 public void remove (String key)
80 public void setClassLoader (ClassLoader loader)
81 public int size ()
82 public synchronized String toString ()
83 public void writeToParcel (Parcel parcel, int
功能:捆绑内容写入到一个包裹,通常它是通过IBinder连接通过。
(1)新建一个bundle类
&Bundle&mBundle&=&new&Bundle();&&&
(2)bundle类中加入数据(key
-value的形式,另一个activity里面取数据的时候,就要用到key,找出对应的value)
mBundle.putString("Data",&"data&from&TestBundle");&&
(3)新建一个intent对象,并将该bundle加入这个intent对象
Intent&intent&=&new&Intent();&&&&&
&&&&&intent.setClass(TestBundle.this,&Target.class);&&&&
Bundle&mBundle&=&new&Bundle();&&&&
&&&&&mBundle.putString("Data",&"data&from&TestBundle");//压入数据&&
intent.putExtras(mBundle);&&&&
startActivity(intent);&&
&Bundle&bundle&=&getIntent().getExtras();//得到传过来的bundle
String&data&=&bundle.getString("Data");//读出数据&&
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。本文来自网络。。。供大家参考
第一、四大组件间数据传递方式:
启动四大组件通过Intent对象来实现,Intent的功能包括启动四大组件以及相关信息+传递数据。
其中传递数据Intent提供了putExtra和对应的getExtra方法来实现:
putExtra和getExtra 其实是和Bundle put和get方法一一对应的,在Intent类中有一个Bundle的mExtras成员变量
所有的putExtra和getExtra方式实际是调用mExtras对象的put和get方法进行存取。
所以正常情况下 四大组件间传递数据直接通过putExtra和getExtra方法存取即可,无需再创建一个bundle对象。
Intent& putExtra方法:
Intent& putExtra(String name, Bundle value)Intent& putExtra(String
name, Parcelable[] value)Intent& putExtra(String name, Serializable
Intent& putExtra(String name, Parcelable value)Intent& putExtra(String
name, int[] value)Intent& putExtra(String name, float value)Intent&
putExtra(String name, byte[] value)Intent& putExtra(String name, long[]
value)Intent& putExtra(String name, float[] value)Intent&
putExtra(String name, long value)Intent& putExtra(String name, String[]
value)Intent& putExtra(String name, boolean value)Intent&
putExtra(String name, boolean[] value)Intent& putExtra(String name, short
value)Intent& putExtra(String name, double value)Intent& putExtra(String
name, short[] value)Intent& putExtra(String name, String value)Intent&
putExtra(String name, byte value)Intent& putExtra(String name, char[]
value)Intent& putExtra(String name, CharSequence[] value)Intent&
putExtras(Intent src)Intent& putExtras(Bundle extras)Intent&
putIntegerArrayListExtra(String name, ArrayList&Integer& value)Intent&
putParcelableArrayListExtra(String name, ArrayList&? extends Parcelable&
value)Intent& putStringArrayListExtra(String name, ArrayList&String&
Intent getExtra方法:
double[]& getDoubleArrayExtra(String name)double& getDoubleExtra(String
name, double defaultValue)Bundle& getExtras()int& getFlags()float[]&
getFloatArrayExtra(String name)float& getFloatExtra(String name, float
defaultValue)int[]& getIntArrayExtra(String name)int& getIntExtra(String
name, int defaultValue)ArrayList&Integer&&
getIntegerArrayListExtra(String name)long[]& getLongArrayExtra(String
name)long& getLongExtra(String name, long defaultValue)Parcelable[]&
getParcelableArrayExtra(String name)&T extends Parcelable&
ArrayList&T&& getParcelableArrayListExtra(String name)&T extends
Parcelable& T& getParcelableExtra(String name)Serializable&
getSerializableExtra(String name)short[]& getShortArrayExtra(String
name)short& getShortExtra(String name, short defaultValue)String[]&
getStringArrayExtra(String name)ArrayList&String&&
getStringArrayListExtra(String name)String& getStringExtra(String
Intent 的mExtras对象:
&&& private Bundle mE
&&& public Intent putExtra(String name, Parcelable value) {&&&&&&& if
(mExtras == null) {&&&&&&&&&&& mExtras = new Bundle();&&&&&&&
}&&&&&&& mExtras.putParcelable(name, value);&&&&&&&&&&
第二、自定义对象的传递:
通过intent 传递自定义对象的方法有两个,第一是实现Serialization接口,第二是实现Parcelable接口。
首选推荐Parceable,android中的很多数据类型都是实现Serialable接口方式来传递的,例如
Intent、Bundle、Bitmap、Uri等等。
android Parcelable化的提供了一个接口 Parcelable和一个工具类 Parcel
Parcelable:一个规范接口,定义实现Parcelable需要实现的功能
Parcel:数据存取的工具类,供用户在实现Parcelable接口时存取自定义数据用,也供系统传递数据时使用。
Parcelable实现要点:需要实现三个东西1)writeToParcel
方法。该方法将类的数据写入外部提供的Parcel中.声明如下:writeToParcel (Parcel dest, int flags)
具体参数含义见javadoc2)describeContents方法。没搞懂有什么用,反正直接返回0也可以3)静态的Parcelable.Creator接口,本接口有两个方法:createFromParcel(Parcel
in) 实现从in中创建出类的实例的功能newArray(int size) 创建一个类型为T,长度为size的数组,仅一句话(return new
T[size])即可。估计本方法是供外部类反序列化本类数组使用。
android doc示例代码:
&publicclassMyParcelableimplementsParcelable{
& & &privateint mData;
& & &publicint describeContents(){
& & & & &return0;
& & &publicvoid writeToParcel(Parcelout,int flags){
& & & & &out.writeInt(mData);
& & &publicstaticfinalParcelable.Creator&MyParcelable& CREATOR
& & & & & & &=newParcelable.Creator&MyParcelable&(){
& & & & &publicMyParcelable createFromParcel(Parcelin){
& & & & & & &returnnewMyParcelable(in);
& & & & &}
& & & & &publicMyParcelable[] newArray(int size){
& & & & & & &returnnewMyParcelable[size];
& & & & &}
& & &privateMyParcelable(Parcelin){
& & & & &mData =in.readInt();
android 中自定义的对象序列化的问题有两个选择一个是Parcelable,另外一个是Serializable。
一 序列化原因:
1.永久性保存对象,保存对象的字节序列到本地文件中;2.通过序列化对象在网络中传递对象;3.通过序列化在进程间传递对象。&
至于选取哪种可参考下面的原则:
1.在使用内存的时候,Parcelable
类比Serializable性能高,所以推荐使用Parcelable类。2.Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC。3.Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点,
也不提倡用,但在这种情况下,还是建议你用Serializable 。
Serializable 的实现,只需要继承 &implements Serializable
即可。这只是给对象打了一个标记,系统会自动将其序列化。2 Parcelabel 的实现,需要在类中添加一个静态成员变量
CREATOR,这个变量需要继承 Parcelable.Creator 接口。
阅读(...) 评论()1719人阅读
序列化数据原理:
序列化的过程就是对象写入字节流和从字节流中读取对象。将对象状态转换成字节流之后,可以用java.io包中的各种字节流类将其保存到文件中,管道到另一线程中或通过网络连接将对象数据发送到另一主机。
简单说就是将数据对象存入字节流当中,在需要时重新生成对象。
Android中的序列化机制:
首先android系统利用Binder进行IPC通讯,且定位为针对内存受限的设备,所以则要求使用高效的对象传输方式,因为Parcel应运而生。
代码分析:
frameworks\base\core\java\android\os\Parcel.java
frameworks\base\core\jni\android_util_Binder.cpp JNI函数
以典型代码片段举例:
* Write an integer value into the parcel at the current dataPosition(),
* growing dataCapacity() if needed.
public final native void writeInt(int val);
* Write a long integer value into the parcel at the current dataPosition(),
* growing dataCapacity() if needed.
public final native void writeLong(long val);
* Write a floating point value into the parcel at the current
* dataPosition(), growing dataCapacity() if needed.
public final native void writeFloat(float val);
JNI层实现:
static void android_os_Parcel_writeInt(JNIEnv* env, jobject clazz, jint val)
Parcel* parcel = parcelForJavaObject(env, clazz);
if (parcel != NULL) {
const status_t err = parcel-&writeInt32(val);
if (err != NO_ERROR) {
jniThrowException(env, &java/lang/OutOfMemoryError&, NULL);
static void android_os_Parcel_writeLong(JNIEnv* env, jobject clazz, jlong val)
Parcel* parcel = parcelForJavaObject(env, clazz);
if (parcel != NULL) {
const status_t err = parcel-&writeInt64(val);
if (err != NO_ERROR) {
jniThrowException(env, &java/lang/OutOfMemoryError&, NULL);
static void android_os_Parcel_writeFloat(JNIEnv* env, jobject clazz, jfloat val)
Parcel* parcel = parcelForJavaObject(env, clazz);
if (parcel != NULL) {
const status_t err = parcel-&writeFloat(val);
if (err != NO_ERROR) {
jniThrowException(env, &java/lang/OutOfMemoryError&, NULL);
其本质使用 Parcel 对象来完成的,实现代码在:frameworks/base/libs/binder/parcel.cpp
status_t Parcel::writeInt32(int32_t val)
return writeAligned(val);
--& 直接利用模块实现
template&class T&
status_t Parcel::writeAligned(T val) {
COMPILE_TIME_ASSERT_FUNCTION_SCOPE(PAD_SIZE(sizeof(T)) == sizeof(T));
if ((mDataPos+sizeof(val)) &= mDataCapacity) {
restart_write:
*reinterpret_cast&T*&(mData+mDataPos) = // 直接在此将数据写入到内存中
return finishWrite(sizeof(val));
status_t err = growData(sizeof(val)); // 数据空间不够的情况下处理
if (err == NO_ERROR) goto restart_
status_t Parcel::growData(size_t len)
size_t newSize = ((mDataSize+len)*3)/2;
// 每次多分配50%的内存空间
return (newSize &= mDataSize)
? (status_t) NO_MEMORY
: continueWrite(newSize);
1、整个读写全是在内存中进行,主要是通过malloc()、realloc()、memcpy()等内存操作进行
2、读写时是PAD_SIZE=4字节对齐, #define PAD_SIZE(s) (((s)+3)&~3)
3、预分配的空间不够时newSize = ((mDataSize+len)*3)/2;会一次多分配50%
4、普通数据,使用的是mData内存地址,对于IBinder类型的数据以及FileDescriptor使用的是mObjects内存地址
举个例子说明一下如何在同一个Activity传递复杂数据类型:
package com.test.
import android.app.A
import android.content.I
import android.os.B
import android.os.P
import android.os.P
import android.util.L
import android.view.KeyE
public class TestParcelActivity extends Activity {
ComplexDataStruct complexData =
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
public boolean onKeyUp(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_0){
testComplexDS();
return super.onKeyUp(keyCode, event);
public void testComplexDS(){
complexData = new ComplexDataStruct();
Intent intent=new Intent(TestParcelActivity.this,TestParcelActivity.class);
complexData.a = 10;
complexData.b = 20;
complexData.str1 = & hello...&;
complexData.str2 = & world...&;
Log.i(&&,&intent.putExtra before&);
intent.putExtra(&testcomplexData&, complexData);
Log.i(&&,&intent.putExtra after&);
Log.i(&&,&intent.getParcelableExtra before&);
ComplexDataStruct test = (ComplexDataStruct)intent.getParcelableExtra(&testcomplexData&);
Log.i(&&,&intent.getParcelableExtra after&);
Log.i(&&,&a=&+test.a);
Log.i(&&,&b=&+test.b);
Log.i(&&,&str1=&+test.str1);
Log.i(&&,&str2=&+test.str2);
/* 一个复杂的Parcelable对象传递 */
public class ComplexDataStruct implements Parcelable{
public int a = 0;
public int b = 0;
public String str1 =
public String str2 =
ComplexDataStruct(){
public ComplexDataStruct(ComplexDataStruct other) {
this.a = other.a;
this.b = other.b;
this.str1 = other.str1;
this.str2 = other.str2;
private ComplexDataStruct(Parcel in) {
Log.e(&&,&readFromParcel is calling...&);
readFromParcel(in);
public void readFromParcel(Parcel in) {
a = in.readInt();
b = in.readInt();
str1 = in.readString();
str2 = in.readString();
Log.e(&&,&readFromParcel is calling...&);
public int describeContents() {
// TODO Auto-generated method stub
public void writeToParcel(Parcel arg0, int arg1) {
// TODO Auto-generated method stub
Log.e(&&,&writeToParcel is calling...&);
arg0.writeInt(a);
arg0.writeInt(b);
arg0.writeString(str1);
arg0.writeString(str2);
Log.e(&&,&writeToParcel is calling...&);
/* 内部实现静态CREATOR类 */
public final Parcelable.Creator&ComplexDataStruct& CREATOR =
new Parcelable.Creator&ComplexDataStruct&() {
// 从Parcel中读取数据,返回ComplexDataStruct对象
public ComplexDataStruct createFromParcel(Parcel in) {
Log.e(&&,&createFromParcel is calling...&);
return new ComplexDataStruct(in);
public ComplexDataStruct[] newArray(int size) {
Log.e(&&,&newArray is calling...&);
return new ComplexDataStruct[size]; // 传递数组
打印结果:
I/ & & & &( 1324): intent.putExtra before
I/ & & & &( 1324): intent.putExtra after
I/ & & & &( 1324): intent.getParcelableExtra before
I/ & & & &( 1324): intent.getParcelableExtra after
I/ & & & &( 1324): a=10
I/ & & & &( 1324): b=20
I/ & & & &( 1324): str1= hello...
I/ & & & &( 1324): str2= world...
这里利用 intent 发送消息,利用 Bundle 来传递数据,Bundle概念下一篇会讲到。
构建复杂数据类型,需要如下实现:
1、继承自 Parcelable 实现,ex: public class ComplexDataStruct implements Parcelable
2、内部有一个静态的 CREATOR 类 : public static final Parcelable.Creator&ComplexDataStruct& CREATOR
3、实现 writeToParcel 和 readFromParcel 序列化与反序列化函数
4、传递使用 Intent.java 类的函数:putExtra 及 getParcelableXXX函数
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:530410次
积分:8169
积分:8169
排名:第810名
原创:149篇
转载:45篇
评论:268条
文章:37篇
阅读:120874
(1)(2)(2)(1)(2)(1)(1)(1)(5)(1)(3)(6)(3)(4)(4)(3)(1)(8)(1)(3)(11)(12)(16)(7)(16)(13)(9)(22)(24)(1)(10)lingdududu 的BLOG
用户名:lingdududu
文章数:216
评论数:175
访问量:826980
注册日期:
阅读量:3000
阅读量:3901
51CTO推荐博文
&&&在Andorid平台中,各个组件运行在自己的进程中,他们之间是不能相互访问的,但是在程序之间是不可避免的要传递一些对象,在进程之间相互通信。为了实现进程之间的相互通信,Andorid采用了一种轻量级的实现方式RPC(Remote Procedure Call 远程进程调用)来完成进程之间的通信,并且Android通过接口定义语言(Andorid Interface Definition Language ,AIDL)来生成两个进程之间相互访问的代码,例如,你在Activity里的代码需要访问Service中的一个方法,那么就可以通过这种方式来实现了。
&& AIDL是Android的一种接口描述语言; 编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的. 如果需要在一个Activity中, 访问另一个Service中的某个对象, 需要先将对象转化成 AIDL可识别的参数(可能是多个参数), 然后使用AIDL来传递这些参数, 在消息的接收端, 使用这些参数组装成自己需要的对象。
&& AIDL RPC机制是通过接口来实现的,类似Windows中的COM或者Corba,但他是轻量级的,客户端和被调用实现之间是通过代理模式实现的,代理类和被代理类实现同一个接口Ibinder接口。
下面是实现Activity访问Service例子的步骤:
一.创建.aidl文件
&&& AIDL使用简单的语法来声明接口,描述其方法以及方法的参数和返回值。这些参数和返回值可以是任何类型,甚至是其他AIDL生成的接口。重要的是必须导入导入除了内建类型(例如:int,boolean等)外的任何其他类型,哪怕是这些类型是在与接口相同的包中。具体的要求如下:
JAVA基本数据类型不需要导入
String,List,Map和CharSequence不需要导入
使用Eclipse的ADT插件创建一个BookInfo.aidl文件,该文件有4个方法:
setName(String name)设置图书的书名,setPrice(int price)设置图书的价格,setPublish(String pname)设置图书的出版社和String display()显示图书的信息.
BookInfo.aidl文件
package&com.android. &&//BookInfo接口 &interface&BookInfo{ &&&&& &&&&&void&setName(String&name); &&&&&void&setPrice(int&price); &&&&&void&ssetPublish(String&pname); &&&&&//显示图书的信息 &&&&&String&display(); &}&
创建好BookInfo.aidl文件,系统会自动在gen目录下生成Java接口文件BookInfo.java
二.实现AIDL文件生成的JAVA接口
&&& AIDL会生成一个和.aidl文件同名的JAVA接口文件,该接口中有一个静态抽象内部类Stub,该类中声明了AIDL文件中定义的所有方法,其中有一个重要的方法是asInterface(),该方法通过代理模式返回JAVA接口的实现我们可以定义一个实现类,BookImpl,该类继承Stub类,实现我们定义的4个方法
package&com.android. &import&android.os.RemoteE &&public&class&BookInfoImpl&extends&BookInfo.Stub&{ &&&&&&&&&&private&int& &&&&&private&String&name, &&&&&&&&&&public&String&display()&throws&RemoteException{ &&&&&&&&&return&&书名:&+name+&;价格:&+price+&;出版社:&+ &&&&&} &&&&&@Override&&&&&&&&&&public&void&setName(String&name)&throws&RemoteException&{ &&&&&&&&&&&&&&&&&&this.name=& &&&&&} &&&&&&@Override&&&&&&&&&&public&void&setPrice(int&price)&throws&RemoteException&{ &&&&&&&&&&&&&&&&&&this.price&=& &&&&&} &&&&&@Override&&&&&&&&&&public&void&setPublish(String&pname)&throws&RemoteException&{ &&&&&&&&&&&&&&&&&&this.pname=& &&&&&}&&& &} &
三.向客户端暴露接口
现在已经实现了BookInfo接口,接下来要将该接口暴露给客户端调用。一般通过定义一个Service来实现,在Service的onBind()方法中返回该接口,当我们绑定该接口时调用该方法。
package&com.android. &&import&com.android.aidl.BookInfo.S &import&android.app.S &import&android.content.I &import&android.os.IB &&public&class&RemoteService&extends&Service&{ &&&&&&&&&&private&Stub&bookifo&=&new&BookInfoImpl(); &&&&&public&IBinder&onBind(Intent&intent){ &&&&&&&&&return& &&&&&} &}&
四.在客户端调用
定义一个Activity来绑定远程Service,获得BookInfo接口,通过RPC机制调用接口中的方法。
package&com.android. &&import&android.app.A &import&android.app.S &import&ponentN &import&android.content.I &import&android.content.ServiceC &import&android.os.B &import&android.os.IB &import&android.os.RemoteE &import&android.view.V &import&android.view.View.OnClickL &import&android.widget.B &import&android.widget.T &&public&class&MainActivity&extends&Activity&{ &&&&&&&&&&private&BookInfo&bookI &&&&&&&&&&private&Button& &&&&&&&&&&private&ServiceConnection&conn&=&new&ServiceConnection()&{ &&&&&&&&&@Override&&&&&&&&&synchronized&public&void&onServiceConnected(ComponentName&name,&IBinder&service)&{ &&&&&&&&&&&&&&&&&&&&&&&&&&bookInfo&=&BookInfo.Stub.asInterface(service); &&&&&&&&&&&&&if&(bookInfo&!=&null) &&&&&&&&&&&&&&&&&try&{ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&bookInfo.setName(&Google&Android&SDK开发范例大全&); &&&&&&&&&&&&&&&&&&&&&bookInfo.setPrice(55); &&&&&&&&&&&&&&&&&&&&&bookInfo.setPublish(&人民邮电出版社&); &&&&&&&&&&&&&&&&&&&&&String&msg&=&bookInfo.display(); &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Toast.makeText(MainActivity.this,&msg,&Toast.LENGTH_LONG) &&&&&&&&&&&&&&&&&&&&&&&&&&&&&.show(); &&&&&&&&&&&&&&&&&}&catch&(RemoteException&e)&{ &&&&&&&&&&&&&&&&&&&&&e.printStackTrace(); &&&&&&&&&&&&&&&&&} &&&&&&&&&} &&&&&&&&&&@Override&&&&&&&&&public&void&onServiceDisconnected(ComponentName&name)&{ &&&&&&&&&&} &&&&&}; &&&&&&@Override&&&&&public&void&onCreate(Bundle&savedInstanceState)&{ &&&&&&&&&super.onCreate(savedInstanceState); &&&&&&&&&&&&&&&&&&setContentView(R.layout.main); &&&&&&&&&&&&&&&&&&btn&=&(Button)&findViewById(R.id.Button1); &&&&&&&&&&&&&&&&&&btn.setOnClickListener(new&OnClickListener()&{ &&&&&&&&&&&&&@Override&&&&&&&&&&&&&public&void&onClick(View&v)&{ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Intent&intent&=&new&Intent(); &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&intent.setAction(&com.android.aidl.action.MY_REMOTE_SERVICE&); &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&bindService(intent,&conn,&Service.BIND_AUTO_CREATE); &&&&&&&&&&&&&} &&&&&&&&&}); &&&&&} &}&
五.main.xml和AndroidManifest.xml文件
&version=&1.0&&encoding=&utf-8&&&xmlns:android=&/apk/res/android&&&&&&android:orientation=&vertical&&&&&&android:layout_width=&fill_parent&&&&&&android:layout_height=&fill_parent&&&&&&&&&&&& &&&&&&&&&android:text=&远程调用Service&& &&&&&&&&&android:id=&@+id/Button1&& &&&&&&&&&android:layout_width=&wrap_content&& &&&&&&&&&android:layout_height=&wrap_content&&&&&&&&&&&&
在AndroidManifest.xml文件16~20声明Service
&version=&1.0&&encoding=&utf-8&&&xmlns:android=&/apk/res/android&&&&&&&&package=&com.android.aidl&&&&&&&&android:versionCode=&1&&&&&&&&android:versionName=&1.0&&&&&&&android:minSdkVersion=&10&&&&&&&&&android:icon=&@drawable/icon&&android:label=&@string/app_name&&&&&&&&&&&android:name=&.MainActivity&&&&&&&&&&&&&&&&&&&&android:label=&@string/app_name&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&android:name=&android.intent.action.MAIN&&&&&&&&&&&&&&&&&&&&android:name=&android.intent.category.LAUNCHER&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&android:name=&RemoteService&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&android:name=&com.android.aidl.action.MY_REMOTE_SERVICE&&&&&&&&&&&&&&&&&&&&&&&&&&
本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)
本文收录至博客专题:《》
13:56:56 14:15:07 14:49:35 15:07:42 15:48:44 15:59:58 17:55:17}

我要回帖

更多关于 android是什么手机 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信