• 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;
            }
        }}
    
  • 相关阅读:
    [C++] inline内联函数使用方法
    [C++] new和delete运算符使用方法
    [C++] namespace命名空间和using用法
    [C++] 引用类型&
    [C++] wchar_t关键字使用方法
    [C++] typeid关键字使用方法
    json_encode转化索引数组之后依然还是数组的问题
    微信网页授权 的流程
    验证码比较hash_equals 方法
    laravel 模型观察器
  • 原文地址:https://www.cnblogs.com/fynnn/p/15393058.html
Copyright © 2020-2023  润新知