AIDL

一、服务端

Step 1:创建AIDL文件:

IPerson.aidl
package com.jay.aidl;
interface IPerson {
    String queryPerson(int num);}

Step 2:自定义Service类,完成下述操作:

1)继承Service类,同时也自定义了一个PersonQueryBinder类用来继承IPerson.Stub类 就是实现了IPerson接口和IBinder接口
2)实例化自定义的Stub类,并重写Service的onBind方法,返回一个binder对象。

AIDLService.java
package com.jay.aidlserver;
import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.os.RemoteException;import com.jay.aidl.IPerson.Stub;
 public class AIDLService extends Service {
    private IBinder binder = new PersonQueryBinder();
    private String[] names = {"11","22","33","44","55"};
    private String query(int num)
    {
        if(num > 0 && num < 6){
            return names[num - 1];
        }
        return null;
    }
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    private final class PersonQueryBinder extends Stub{
        @Override
        public String queryPerson(int num) throws RemoteException {
            return query(num);
        }
    }}

Step 3:在AndroidManifest.xml文件中注册Service

<service android:name=".AIDLService">
            <intent-filter>
                <action android:name="android.intent.action.AIDLService" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </service>

二、客户端

直接把服务端的那个aidl文件复制过来,然后我们直接在MainActivity中完成,和绑定本地Service的操作
有点类似,流程如下:

1)自定义PersonConnection类实现ServiceConnection接口

2)以PersonConnection对象作为参数,调用bindService绑定远程Service

bindService(service,conn,BIND_AUTO_CREATE);
ps:第三个参数是设置如果服务没有启动的话,自动创建

3)和本地Service不同,绑定远程Service的ServiceConnection并不能直接获取Service的onBind( )方法返回的IBinder对象,只能返回onBind( )方法所返回的代理对象,需要做如下处理:

iPerson = IPerson.Stub.asInterface(service);
再接着完成初始化,以及按钮事件等就可以了
具体代码如下:
MainActivity.java

package com.jay.aidlclient;
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.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.jay.aidl.IPerson;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private EditText edit_num;
    private Button btn_query;
    private TextView txt_name;
    private IPerson iPerson;
    private PersonConnection conn = new PersonConnection();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bindViews();
        //绑定远程Service
        Intent service = new Intent("android.intent.action.AIDLService");
        service.setPackage("com.jay.aidlserver");
        bindService(service, conn, BIND_AUTO_CREATE);
        btn_query.setOnClickListener(this);
    }
    private void bindViews() {
        edit_num = (EditText) findViewById(R.id.edit_num);
        btn_query = (Button) findViewById(R.id.btn_query);
        txt_name = (TextView) findViewById(R.id.txt_name);
    }
    @Override
    public void onClick(View v) {
        String number = edit_num.getText().toString();
        int num = Integer.valueOf(number);
        try {
            txt_name.setText(iPerson.queryPerson(num));
        } catch (RemoteException e) {
            e.printStackTrace();
        }
        edit_num.setText("");
    }
    private final class PersonConnection implements ServiceConnection {
        public void onServiceConnected(ComponentName name, IBinder service) {
            iPerson = IPerson.Stub.asInterface(service);
        }
        public void onServiceDisconnected(ComponentName name) {
            iPerson = null;
        }
    }}
posted @ 2021-10-11 13:39  fynnn  阅读(70)  评论(0编辑  收藏  举报