Service端------------------------------------------------------------------------------------------------------1、创建A.aidl文件,里面定义个接口A(名字必须和文件名一样、并且需要手动导入该文件所在的包,eg:package com.xy.service;),接口里写自己要的方法,这里我写了String sayHello();文件保存之后系统会自动在gen目录下生成接口名A对应的Java文件,里面一大推东西不需要要看懂。如下:package com.xy.service;interface A{String getName();//返回StringBoy getBoy();//返回Boy对象,该对象是有要求的List<Boy> getAllBoy();//返回集合}这样写的话还需要其它类,一个实现了Parcelable接口的Boy类(属于自定义的类因此需要手动import Boy所在包,eg:import com.xy.service.Boy;<用到boy类的aidl文件都需要手动import>),还需要Boy.aidl,内容如下package com.xy.service;//同样需要手动packageparcelable Boy;//这里很简单的一句话,注意大小写//Boy.java...........package com.xy.service;import android.os.Parcel;import android.os.Parcelable;public class Boy implements Parcelable {//这个是必须写的public static final Parcelable.Creator<Boy> CREATOR = new Parcelable.Creator<Boy>() {public Boy createFromParcel(Parcel in) {return new Boy(in);//用自己写的类型就行}public Boy[] newArray(int size) {return new Boy[size];//用自己写的类型就行}};//无参构造方法public Boy() {}//必须的构造方法private Boy(Parcel in) {name = in.readString();age = in.readInt();}//方便测试的构造方法public Boy(String name, int age) {super();this.name = name;this.age = age;}private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}//实现接口的方法@Overridepublic int describeContents() {return 0;//一般是返回0就行}//实现接口的方法@Overridepublic void writeToParcel(Parcel dest, int flags) {dest.writeString(name);//参数是前面定义的字段dest.writeInt(age);//参数是前面定义的字段}}2、创建一个Service,需要继承系统的Service。关键是创建一个AIDL对象并返回,在里面实现之前定义的方法。如下:public class MyService extends Service {@Overridepublic IBinder onBind(Intent intent) {return myBind;}private A.Stub myBind = new A.Stub() {@Overridepublic String getName() throws RemoteException {return "我是小袁";}@Overridepublic Boy getBoy() throws RemoteException {return new Boy("张三",35);}@Overridepublic List<Boy> getAllBoy() throws RemoteException {List<Boy> list = new ArrayList<Boy>();list.add(new Boy("李四", 10));list.add(new Boy("王五", 15));list.add(new Boy("无极", 21));list.add(new Boy("三丰", 88));return list;}};}3、在AndroidManifest.xml文件中对Service进行配置,如下<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.xy.service"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk android:minSdkVersion="10" />    <applicationandroid:icon="@drawable/ic_launcher"android:label="@string/app_name" ><activity    android:label="@string/app_name"    android:name=".ServiceActivity" >    <intent-filter ><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" />    </intent-filter></activity><--添加的对Service的配置在这里!--><!-- android:process=":remote",代表在应用程序里,当需要该service时,会自动创建新的进程。而如果是android:process="remote",没有“:”分号的,则创建全局进程,不同的应用程序共享该进程 --><service android:name=".MyService" android:process=":remote"><intent-filter >  <action android:name="com.xy.service.MyService"/></intent-filter></service>    </application></manifest>Client端------------------------------------------------------------------------------------------------------1、将Service端的两个AIDL文件(如果有自定义的类同样需要拿过去,eg:Boy.class)Copy过来放在该工程里和之前该文件相同的目录下(可能需要新建一个包),保存之后同样会在gen目录下自动生成Java文件2、在main.xml里添加个Button用来测试该程序<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" >    <TextViewandroid:id="@+id/textView"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/hello" /><Button    android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:id="@+id/button"    android:text="调用AIDl"/></LinearLayout>3、在主Activity里找到这两个控件并监听Button的事件,主要是创建一个ServiceConnectionpublic class CilentActivity extends Activity {private TextView tv;//用来显示结果的private ServiceConnection mConnection = new ServiceConnection() {private A a = null;//AIDL对象public void onServiceDisconnected(ComponentName name) {a = null;}public void onServiceConnected(ComponentName name, IBinder service) {a = A.Stub.asInterface(service);// aidl通信try {String mText = "Say hello: " + a.getName() + "/n";boolean bool = a.getAllBoy() == null ? false : true;tv.setText("getName is : " + mText + "getBoy's name is "+ a.getBoy().getName() + "getBoy's age is "+ a.getBoy().getAge() + " /n bool is " + bool);} catch (RemoteException e) {e.printStackTrace();}}};/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);initView();}private void initView() {tv = (TextView) findViewById(R.id.textView);findViewById(R.id.button).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//这里启动的就是之前配置的服务名Intent intent = new Intent("com.xy.service.MyService");bindService(intent, mConnection,BIND_AUTO_CREATE);}});}}

更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. Android(安卓)9.0静默安装与卸载app
  6. Android(安卓)Studio,gradle project sync failed 错误
  7. Android(安卓)百分比布局详解及实例代码
  8. Android安全知识库
  9. Android(安卓)利用soap协议与服务端进行通信

随机推荐

  1. 这一年半以来,关于 Android,我都写了些什么
  2. Android实现一个天气界面竟然如此简单?
  3. 【SMS】android 短信接收流程分析——-拦
  4. Android图片滚动,加入自动播放功能,使用自
  5. 中国移动互联网:清一色的NOKIA!
  6. Android优秀第三方开源(一)
  7. 阿里云栖大会 app加固小记
  8. Android(安卓)-- Init进程对属性系统的处
  9. Android二维码的扫描和生成(ZXing)
  10. Android技术学习的实现机制和一些常用技