android远程服务的绑定

原理图:

1、访问远程服务的原理图

 

2、AIDL介绍

 

3、IPC原理图

 

二、实现步骤

上面的操作(之前的那一篇博客)是一个本地的服务。在开发的时候有可能还会去调用别人应用里面提供好的服务。
远程绑定服务,调用服务里面的方法。
1 编写一个接口,再把接口文件修改为aidl,不能有修饰符。
如果我们使用了自定义对象需要实现Parcelable接口,还需要定义个一个aidl文件对这个类进行一个描述(Student.aidl).
编译器就会在gen目录下面生成对应的xx.java文件
2 在服务里面创建一个内部类:extends  Stub 实现未实现的方法。
生成这个类的对象通过onBind()方法返回。

3 在客户端绑定服务。
注意:
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
ibinder = Stub.asInterface(service);
}

 

三、代码如下:

1、client端

1)main.xml

 

[html][/html] view plaincopyprint?

  1. <?xml version=”1.0″ encoding=”utf-8″?>
  2. <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
  3.     android:layout_width=”match_parent”
  4.     android:layout_height=”match_parent”
  5.     android:orientation=”vertical” >
  6.     <TextView
  7.         android:layout_width=”fill_parent”
  8.         android:layout_height=”wrap_content”
  9.         android:text=”学号”
  10.         />
  11.     <EditText
  12.         android:id=”@+id/et_no”
  13.         android:layout_width=”fill_parent”
  14.         android:layout_height=”wrap_content”
  15.         />
  16.     <Button
  17.         android:layout_width=”wrap_content”
  18.         android:layout_height=”wrap_content”
  19.         android:text=”查询1″
  20.         android:onClick=”query1″
  21.         />
  22.     <TextView
  23.         android:id=”@+id/tv_info”
  24.         android:layout_width=”fill_parent”
  25.         android:layout_height=”fill_parent”
  26.         />
  27. </LinearLayout>

 

2)MainActivity

 

[java][/java] view plaincopyprint?

  1. package com.njupt.client1;
  2. import com.njupt.domain.Student;
  3. import com.njupt.inter.IStudentQueryService;
  4. import com.njupt.inter.IStudentQueryService.Stub;
  5. import android.os.Bundle;
  6. import android.os.IBinder;
  7. import android.os.RemoteException;
  8. import android.app.Activity;
  9. import android.content.ComponentName;
  10. import android.content.Intent;
  11. import android.content.ServiceConnection;
  12. import android.view.Menu;
  13. import android.view.View;
  14. import android.widget.EditText;
  15. import android.widget.TextView;
  16. public class MainActivity extends Activity {
  17.     private EditText et_no;
  18.     private TextView tv_info;
  19.     private MyServiceConnection conn;
  20.     private IStudentQueryService ibinder;
  21.     @Override
  22.     protected void onCreate(Bundle savedInstanceState) {
  23.         super.onCreate(savedInstanceState);
  24.         setContentView(R.layout.main);
  25.         et_no = (EditText) findViewById(R.id.et_no);
  26.         tv_info = (TextView) findViewById(R.id.tv_info);
  27.         conn = new MyServiceConnection();
  28.         Intent intent = new Intent();
  29.         intent.setAction(“com.njupt.action.myservice”);
  30.         bindService(intent,conn,BIND_AUTO_CREATE);
  31.     }
  32.     private class MyServiceConnection implements ServiceConnection{
  33.         @Override
  34.         public void onServiceConnected(ComponentName name, IBinder service) {
  35.             ibinder = Stub.asInterface(service);
  36.         }
  37.         @Override
  38.         public void onServiceDisconnected(ComponentName name) {
  39.             ibinder = null;
  40.             conn = null;
  41.         }
  42.     }
  43.     @Override
  44.     protected void onDestroy() {
  45.         super.onDestroy();
  46.         unbindService(conn);
  47.     }
  48.     public void query1(View v)throws RemoteException{
  49.         String no = et_no.getText().toString();
  50.         Student student = ibinder.queryStudent(Integer.parseInt(no));
  51.         tv_info.setText(student.toString());
  52.     }
  53.     @Override
  54.     public boolean onCreateOptionsMenu(Menu menu) {
  55.         // Inflate the menu; this adds items to the action bar if it is present.
  56.         getMenuInflater().inflate(R.menu.main, menu);
  57.         return true;
  58.     }
  59. }

 

2、server端

这里,server端不需要创建Activity文件

1)MyService

 

[java][/java] view plaincopyprint?

  1. package com.njupt.service;
  2. import com.njupt.domain.Student;
  3. import com.njupt.inter.IStudentQueryService.Stub;
  4. import android.app.Service;
  5. import android.content.Intent;
  6. import android.os.IBinder;
  7. public class MyService extends Service {
  8.     private StudentBinder ibinder = new StudentBinder();
  9.     private Student[] students = new Student[]{
  10.         new Student(1,”刘亦菲”,25),
  11.         new Student(2,”章泽天”,21),
  12.         new Student(3,”allen”,21),
  13.         new Student(4,”刘诗诗”,25)
  14.     };
  15.     @Override
  16.     public IBinder onBind(Intent intent) {
  17.         return ibinder;
  18.     }
  19.     private class StudentBinder extends Stub{
  20.         public Student queryStudent(int no){
  21.             return query(no);
  22.         }
  23.     }
  24.     private Student query(int no){
  25.         return students[no – 1];
  26.     }
  27. }

 

2)IStudentQueryService

 

[java][/java] view plaincopyprint?

  1. package com.njupt.inter;
  2. import com.njupt.domain.Student;
  3. interface IStudentQueryService {
  4.     Student queryStudent(int no);
  5. }

 

3)Student

 

[html][/html] view plaincopyprint?

  1. package com.njupt.domain;
  2. import android.os.Parcel;
  3. import android.os.Parcelable;
  4. public class Student implements Parcelable {
  5.     private int id;
  6.     private String name;
  7.     private int age;
  8.     public int getId() {
  9.         return id;
  10.     }
  11.     public void setId(int id) {
  12.         this.id = id;
  13.     }
  14.     public String getName() {
  15.         return name;
  16.     }
  17.     public void setName(String name) {
  18.         this.name = name;
  19.     }
  20.     public int getAge() {
  21.         return age;
  22.     }
  23.     public void setAge(int age) {
  24.         this.age = age;
  25.     }
  26.     public Student(int id, String name, int age) {
  27.         super();
  28.         this.id = id;
  29.         this.name = name;
  30.         this.age = age;
  31.     }
  32.     public Student() {
  33.         super();
  34.     }
  35.     @Override
  36.     public String toString() {
  37.         return “Student [id=” + id + “, name=” + name + “, age=” + age + “]”;
  38.     }
  39.     @Override
  40.     public int describeContents() {
  41.         return 0;
  42.     }
  43.     @Override
  44.     public void writeToParcel(Parcel dest, int flags) {
  45.         dest.writeInt(id);
  46.         dest.writeString(name);
  47.         dest.writeInt(age);
  48.     }
  49.     public static final Parcelable.Creator<Student> CREATOR = new Parcelable.Creator<Student>() {
  50.         public Student createFromParcel(Parcel in) {
  51.             return new Student(in);
  52.         }
  53.         public Student[] newArray(int size) {
  54.             return new Student[size];
  55.         }
  56.     };
  57.     private Student(Parcel in) {
  58.         id = in.readInt();
  59.         name = in.readString();
  60.         age = in.readInt();
  61.     }
  62. }

 

4)创建一个Student.aidl文件,并在里面写上以下代码:

 

[plain][/plain] view plaincopyprint?

  1. package com.njupt.domain;
  2. parcelable Student;

并将IStudentQueryService.java文件的后缀名改成.aidl

 

 

5)将.aidl文件所在的包由Server端拷一份到Client端

 

6)AndroidManifest.xml

在清单文件上注册service组件,并暴露服务的接口

 

[html][/html] view plaincopyprint?

  1. <service android:name=”com.njupt.service.MyService”>
  2.           <intent-filter >
  3.               <action android:name=”com.njupt.action.myservice”/>
  4.           </intent-filter>
  5.         </service>

标签