android之Service介绍之三 AIDL与传递对象

转载 2015年11月18日 13:33:26

除了上一篇文章我们提到的通过service提供音乐播放等类似的服务之外,我们还可以通过service将对象传递回来哦,你知道怎么用吗,先看例子:

当我们点击“获取”时,会从另一个线程的service中获取一个对象,然后将里面的内容读出来。

--------------------------------------------------------------------------------------------

对于aidl实现以对象的方式交互。主要步骤如下:

 

 

服务端:

第一:定义一个实体类,这里是Beauty,定义一个服务接口aidl文件RemoteBeauty.aidl,这里有一点需要注意,我们引用自定义的实体类到aidl中时需要通过import导入包,但是你会发现,即使你导入了包,还是提示找不到,这时候,你要做的是,建一个以实体类名称命名的aidl文件,如Beauty.aidl,在里面添加一句pracelable Beauty。

第二:开始编写Beauty,这里一定要注意,它一定要实现Pracelable接口,该接口是一个序列化的接口,功能和serializable相似,但是功能更加的迅速。此外,在该Beauty内部一定要声明一个public static final Pracelable.Creator<T>CREATOR对象!!除了里面的那个T代表实体类之外,其他的都不准改变哦。

 

第三:在androidManifest.xml中注册service。并定义好访问该service的action字符串。

 

 

客户端:

客户端这边相应的要简单很多,但是要注意的一点是,要将实体类还有aidl文件都拷贝过来哦,而且要保证路径完全一致!!

 

-------------------------------------------------------------

代码示例:

服务端:

 

Beauty.java

 

 

[java] view plaincopy
  1. package cn.com.chenzheng_java.service;  
  2.   
  3. import android.os.Parcel;  
  4. import android.os.Parcelable;  
  5. /** 
  6.  *  
  7.  * @author chenzheng_java 
  8.  * @description  Parcelable是android提供的一个比serializable效率更高的序列号接口 
  9.  *              这里必须要继承Parcelable哦,不序列号怎么可以传递……对吧?! 
  10.  * 在实体类我们要做两件重要的事情: 
  11.  * 第一:实现Parcelable接口 
  12.  * 第二:定义一个Parcelable.Creator类型的CREATOR对象 
  13.  * 第三:要提供一个Beauty.aidl文件,其中内容为parcelable Beauty,定义了之后,在其他aidl文件中引用Beauty时便不会提示出错了。 
  14.  * @since 2011/03/18 
  15.  * 
  16.  */  
  17. public class Beauty implements Parcelable {  
  18.   
  19.     String name ;  
  20.     int age ;  
  21.     String sex ;  
  22.       
  23.     public String getName() {  
  24.         return name;  
  25.     }  
  26.   
  27.     public void setName(String name) {  
  28.         this.name = name;  
  29.     }  
  30.   
  31.     public int getAge() {  
  32.         return age;  
  33.     }  
  34.   
  35.     public void setAge(int age) {  
  36.         this.age = age;  
  37.     }  
  38.   
  39.     public String getSex() {  
  40.         return sex;  
  41.     }  
  42.   
  43.     public void setSex(String sex) {  
  44.         this.sex = sex;  
  45.     }  
  46.   
  47.     @Override  
  48.     public int describeContents() {  
  49.         return 0;  
  50.     }  
  51.   
  52.     /** 
  53.      * 将对象序列号 
  54.      * dest 就是对象即将写入的目的对象 
  55.      * flags 有关对象序列号的方式的标识 
  56.      * 这里要注意,写入的顺序要和在createFromParcel方法中读出的顺序完全相同。例如这里先写入的为name, 
  57.      * 那么在createFromParcel就要先读name 
  58.      */  
  59.     @Override  
  60.     public void writeToParcel(Parcel dest, int flags) {  
  61.               
  62.             dest.writeString(name);  
  63.             dest.writeInt(age);  
  64.             dest.writeString(sex);  
  65.     }  
  66.     /** 
  67.      * 在想要进行序列号传递的实体类内部一定要声明该常量。常量名只能是CREATOR,类型也必须是 
  68.      * Parcelable.Creator<T> 
  69.      */  
  70.     public static final Parcelable.Creator<Beauty> CREATOR = new Creator<Beauty>() {  
  71.           
  72.         /** 
  73.          * 创建一个要序列号的实体类的数组,数组中存储的都设置为null 
  74.          */  
  75.         @Override  
  76.         public Beauty[] newArray(int size) {  
  77.             return new Beauty[size];  
  78.         }  
  79.           
  80.         /*** 
  81.          * 根据序列号的Parcel对象,反序列号为原本的实体对象 
  82.          * 读出顺序要和writeToParcel的写入顺序相同 
  83.          */  
  84.         @Override  
  85.         public Beauty createFromParcel(Parcel source) {  
  86.             String name = source.readString();  
  87.             int age = source.readInt();  
  88.             String sex = source.readString();  
  89.             Beauty beauty = new Beauty();  
  90.             beauty.setName(name);  
  91.             beauty.setAge(age);  
  92.             beauty.setSex(sex);  
  93.               
  94.             return beauty;  
  95.         }  
  96.     };  
  97.       
  98.       
  99.       
  100. }  

 

RemoteService.java

[java] view plaincopy
  1. package cn.com.chenzheng_java.service;  
  2.   
  3. import android.app.Service;  
  4. import android.content.Intent;  
  5. import android.os.IBinder;  
  6. import android.os.RemoteException;  
  7. import android.util.Log;  
  8. /** 
  9.  *  
  10.  * @author chenzheng_java 
  11.  * @description 提供服务的service 
  12.  * 
  13.  */  
  14. public class RemoteService extends Service {  
  15.   
  16.     @Override  
  17.     public IBinder onBind(Intent intent) {  
  18.         Log.i("通知""执行了OnBind");  
  19.         return new MyBinder();  
  20.     }  
  21.   
  22.       
  23.     private class MyBinder extends RemoteBeauty.Stub{  
  24.   
  25.         @Override  
  26.         public Beauty getBeauty() throws RemoteException {  
  27.               
  28.             Beauty beauty = new Beauty();  
  29.             beauty.setName("feifei");  
  30.             beauty.setAge(21);  
  31.             beauty.setSex("female");  
  32.               
  33.             return beauty;  
  34.         }}  
  35.       
  36.       
  37.       
  38. }  

ServiceActivity.java

[java] view plaincopy
  1. package cn.com.chenzheng_java.service;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. /** 
  6.  * @description 进程之间对象数据的传递 
  7.  * @author chenzheng_java 
  8.  * 
  9.  */  
  10. public class ServiceActivity extends Activity {  
  11.     @Override  
  12.     public void onCreate(Bundle savedInstanceState) {  
  13.         super.onCreate(savedInstanceState);  
  14.         setContentView(R.layout.main);  
  15.     }  
  16. }  

Beauty.aidl

[c-sharp] view plaincopy
  1. parcelable Beauty;  

RemoteBeauty.aidl

[java] view plaincopy
  1. package cn.com.chenzheng_java.service;  
  2. import cn.com.chenzheng_java.service.Beauty;  
  3.  interface RemoteBeauty {  
  4.   
  5.     Beauty getBeauty();  
  6.       
  7. }  

manifest.xml

[xhtml] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.       package="cn.com.chenzheng_java.service"  
  4.       android:versionCode="1"  
  5.       android:versionName="1.0">  
  6.     <uses-sdk android:minSdkVersion="8" />  
  7.   
  8.     <application android:icon="@drawable/icon" android:label="@string/app_name">  
  9.         <activity android:name=".ServiceActivity"  
  10.                   android:label="@string/app_name">  
  11.             <intent-filter>  
  12.                 <action android:name="android.intent.action.MAIN" />  
  13.                 <category android:name="android.intent.category.LAUNCHER" />  
  14.             </intent-filter>  
  15.         </activity>  
  16.   
  17. <!-- service开始 -->  
  18.     <service android:name="RemoteService">  
  19.         <intent-filter>  
  20.             <action android:name="cn.com.chenzheng_java.remote2"/>  
  21.         </intent-filter>  
  22.     </service>  
  23. <!-- service结束 -->  
  24.     </application>  
  25. </manifest>  

-------------------------------------

客户端:

ClientActivity.java

[java] view plaincopy
  1. package cn.com.chenzheng_java.client;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.ComponentName;  
  5. import android.content.Context;  
  6. import android.content.Intent;  
  7. import android.content.ServiceConnection;  
  8. import android.os.Bundle;  
  9. import android.os.IBinder;  
  10. import android.os.RemoteException;  
  11. import android.util.Log;  
  12. import android.view.View;  
  13. import android.view.View.OnClickListener;  
  14. import android.widget.Button;  
  15. import android.widget.TextView;  
  16. import cn.com.chenzheng_java.service.Beauty;  
  17. import cn.com.chenzheng_java.service.RemoteBeauty;  
  18.   
  19. public class ClientActivity extends Activity implements OnClickListener {  
  20.     TextView textView ;  
  21.     Button button ;  
  22.     String actionName = "cn.com.chenzheng_java.remote2";  
  23.     RemoteBeauty remoteBeauty;  
  24.       
  25.     @Override  
  26.     public void onCreate(Bundle savedInstanceState) {  
  27.         super.onCreate(savedInstanceState);  
  28.         setContentView(R.layout.main);  
  29.         textView = (TextView) findViewById(R.id.textView1);  
  30.         button = (Button) findViewById(R.id.button1);  
  31.           
  32.         button.setOnClickListener(this);  
  33.     }  
  34.   
  35.     private class MyServiceConnection implements ServiceConnection{  
  36.   
  37.         @Override  
  38.         public void onServiceConnected(ComponentName name, IBinder service) {  
  39.             Log.i("通知""链接成功!");  
  40.             remoteBeauty = RemoteBeauty.Stub.asInterface(service);  
  41.             try {  
  42.                 Beauty beauty = remoteBeauty.getBeauty();  
  43.                 textView.setText("美女  姓名:"+beauty.getName()+"  年龄:"+beauty.getAge() +" 性别:"+beauty.getSex());  
  44.                   
  45.                   
  46.             } catch (RemoteException e) {  
  47.                 e.printStackTrace();  
  48.             }  
  49.         }  
  50.   
  51.         @Override  
  52.         public void onServiceDisconnected(ComponentName name) {  
  53.               
  54.         }  
  55.           
  56.     }  
  57.     MyServiceConnection connection = new MyServiceConnection();  
  58.     @Override  
  59.     public void onClick(View v) {  
  60.         Intent intent  = new Intent(actionName);  
  61.         bindService(intent, connection, Context.BIND_AUTO_CREATE);  
  62.     }  
  63. }  

另外Beauty.java 以及RemoteBeauty.aidl都是从服务端系统中拷贝过来的哦。

 

 

 如果你想你的service在系统开机时自启动。可以在service的androidManifest.xml中加上这样的配置。

<receiver android:name=".StartBroadcastReceiver">

 

            <intent-filter>

   <action android:name="android.intent.action.BOOT_COMPLETED"/>

            </intent-filter>        

</receiver>

相关文章推荐

android之Service介绍之三 AIDL与传递对象

除了上一篇文章我们提到的通过service提供音乐播放等类似的服务之外,我们还可以通过service将对象传递回来哦,你知道怎么用吗,先看例子:当我们点击“获取”时,会从另一个线程的service中获...

Android Service 之三(Bind Service,使用 AIDL)

http://www.race604.com/communicate-with-remote-service-1/ 首先,大概来总结一下与Service的通信方式有很多种: 通...

android之Service介绍之四 如何传递复杂数据的AIDL服务

传递复杂数据的AIDL服务 AIDL是一种接口定义语言,用于约束两个进程间的通信规则,供编译器生成代码,实现 Android 设备上的进程间通信。  进程之间的通信信息首先会被转换成AI...

android Service之三:传递基本型数据的远程服务

让其他应用程序复用本程序的服务。这样的服务叫远程(remote)服务,实际上是进程间通信(RPC)。 这时需要使用android接口描述语言(AIDL)来定义远程服务的接口,而不是上述那样简单的ja...
  • LAMP_zy
  • LAMP_zy
  • 2012年07月02日 20:39
  • 2814

Android笔记三:Android 接口定义语言 (AIDL)--传递对象

Android 接口定义语言 (AIDL)–传递对象通过 IPC 传递对象通过 IPC 接口把某个类从一个进程发送到另一个进程是可以实现的。 不过,您必须确保该类的代码对 IPC 通道的另一端可用,并...

Android aidl实现传递对象

  • 2017年01月10日 21:06
  • 44.78MB
  • 下载

Android AIDL Service 跨进程传递复杂数据

服务交互的方式有很多,广播、文件、接口都可以;但是假如服务处于独立进程中,并要求效率呢? 此时AIDL可以为你解决,但是AIDL中,默认传递的类型不多(String,Char,Int,Long,Boo...
  • qiujuer
  • qiujuer
  • 2015年07月15日 13:48
  • 3266
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android之Service介绍之三 AIDL与传递对象
举报原因:
原因补充:

(最多只允许输入30个字)