AIDL 服务只支持有限的数据类型,如果用AIDL服务传递一些复杂的数据就需要做更一步处理, AIDL 服务支持的数据类型如下:
1. Java 的基本数据类型(不需要import)
2. String 和CharSequence(不需要import)
3. List 和 Map ,List和Map 对象的元素必须是AIDL支持的数据类型; (以上三种类型都不需要import)
4. AIDL 自动生成的接口 (需要import)
5. 实现android.os.Parcelable 接口的类. (需要import)
要传递一个需要import 的数据类型的值(如: 实现Parcelable接口的类),除了要建立一个实现Parcelable 接口的类外, 还需要为这个类单独建立一个aidl 文件, 并使用parcelable 关键字进行定义。
########################################
下面编写一个可以传递Product对象的AIDL服务。
步骤1,新建类Product.java,实现Parcelable接口。代码如下:
package com.example.service07_aidlservice; import android.os.Parcel; import android.os.Parcelable; public class Product implements Parcelable { private int id; private String name; private float price; public Product() { } public Product(Parcel in) { id = in.readInt(); name = in.readString(); price = in.readFloat(); } /* * 在Product 类中必须有一个静态常量,常量名必须为CREATOR,而且CREATOR 常量的数据类型必须是Parcelable.Creator */ public static final Parcelable.Creator<Product> CREATOR = new Parcelable.Creator<Product>() { @Override public Product createFromParcel(Parcel in) { return new Product(in); } @Override public Product[] newArray(int size) { return new Product[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(id); dest.writeString(name); dest.writeFloat(price); } //getter 和 setter 省略 }
步骤2 ,为这个类单独建立一个aidl 文件, 并使用parcelable 关键字进行定义,Product.aidl代码如下
parcelable Product; // parcelable 首字母是小写
步骤3,新建IMyService.aidl文件,代码如下:
package com.example.service07_aidlservice; import com.example.service07_aidlservice.Product;//必须导包 import java.util.Map;//可以不导包 interface IMyService { //由于product只用于输入,因此需要加in 修饰符 Map getMap(in String country,in Product product); Product getProduct(); }
步骤4,编写一个Seravice类,MyService.java代码如下:
package com.example.service07_service; import java.util.HashMap; import java.util.Map; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.os.RemoteException; import com.example.service07_aidlservice.IMyService.Stub; import com.example.service07_aidlservice.Product; public class MyService extends Service { private MyBinder myBinder; @Override public IBinder onBind(Intent intent) { return new MyBinder(); } /* * 该类继承了IMyService.Stub类而不是extends Binder类。 * IMyService.Stub是Binder的子类。 * 进程内的Service定义MyBinder内部类是继承Binder类。 */ private class MyBinder extends IMyService.Stub { @Override public Map getMap(String country, Product product) throws RemoteException { Map map = new HashMap<String, String>(); map.put("country", country); map.put("id", product.getId()); map.put("name", product.getName()); map.put("price", product.getPrice()); map.put("product", product); return map; } @Override public Product getProduct() throws RemoteException { Product product = new Product(); product.setId(1234); product.setName("奔驰"); product.setPrice(300000); return product; } } }
步骤5,在AndroidManifest.xml中注册Service,并去掉MianActivity的配置。
<service android:name="com.example.service07_service.MyService" > <intent-filter> <!-- 指定客户端调用AIDL服务所需要的Action --> <action android:name="com.example.service07.aidl" /> </intent-filter> </service>
服务端的代码结构如下:
步骤6,客户端的编写:新建客户端项目,把IMyService.aidl,Product.aidl,Product.java 连同包一起拷贝到Client的src目录。注意,实体类也要拷贝过去。这几个类最好放在一个包下,因为我放在不同的包下一直报错找不到类,即使我正确的导包了还是报错。
步骤7,编写MainActivity.java 和 xml布局文件;界面提供了2个按钮。BIND 按钮 和 INVOKE 按钮.
package com.example.service07_aidlclient; import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import com.example.service07_aidlservice.IMyService; import com.example.service07_aidlservice.Product; public class MainActivity extends Activity implements OnClickListener { Button btnBind;//点击该按钮,启动远程Service Button btnInvoke;//点击该按钮,远程调用Service IMyService mBinder; // 接口的一个引用 private ServiceConnection mConn = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { } @Override public void onServiceConnected(ComponentName name, IBinder service) { /* * 获得另一个进程中的Service传递过来的对象service, * 用IMyService.Stub.asInterface方法转换该对象,这点与进程内的通信不同 */ mBinder = IMyService.Stub.asInterface(service); btnInvoke.setEnabled(true); Log.i("MainActivity", "onServiceConnected...."); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnBind = (Button) findViewById(R.id.btn_bind); btnInvoke = (Button) findViewById(R.id.btn_invoke); btnBind.setOnClickListener(this); btnInvoke.setOnClickListener(this); } @Override public void onClick(View v) { Intent intent = new Intent(); int btn = v.getId(); switch (btn) { case R.id.btn_bind: //Constant类中定义了要远程调用的服务 //public static final String ACTION_SERVICE = "com.example.service07.aidl"; intent.setAction(Constant.ACTION_SERVICE); bindService(intent, mConn, BIND_AUTO_CREATE); break; case R.id.btn_invoke: try { Product p = mBinder.getProduct(); Log.i("TAG", mBinder.getMap("country", p).toString()); Log.i("TAG", p.getName()); } catch (RemoteException e) { e.printStackTrace(); } break; } } }
步骤8,先运行service服务端,再运行client客服端,得到结果如下:
相关推荐
Service的进程间通信,通过ADIL来实现的。
android中adil的简单调用源码
使用用adil编写了一个简单的实例,其中包含了服务和客户端下载后安装就可以使用
android 中如何使用ADIL,里面是具体实例
android ADIL 很好的入门代码 分为client 和 server端
是一个简单例子适合初学,我也是刚学到自己写了一个分享下哈
AndroidAIDL通讯 注意切换Androidstudio LOG日志。。。。。
本文主要介绍Android AIDL和远程Service,这里详细介绍了相关知识,并附实例代码和实现效果图,有兴趣的朋友参考下
This is Important file for education
Android学习测试代码,主要有两个项目,内容分别为Service的一般开启和使用绑定Activity,数据传输的一个项目ServiceTest,里头有提供adil文件后端服务,以供给另一个项目ServiceClient调用,即远程服务(此处的远程...
This file is very useful for high education .
This is very useful file for student for higher education.
This file is very important for higher education.
This file is very useful for higher education.
This file is very important foe higher education.
Important file for higher education
Simatic STEP7 MPI Cable Driver
This is useful file for PLC control systems.
This is useful file for S7 PLC control systems.
通过AIDL 实现Client求1+2的和,服务端实现具体的做法,并通过Ibinder来获取服务端的ADIL对象来操作。