zoukankan      html  css  js  c++  java
  • AIDL跨进程通信

    Android跨进程通信会用到AIDL,当然跨进程通信不一定要用AIDL,像广播也是可以的,当然这里用到AIDL相对比较安全一些;

    AIDL允许传递基本数据类型(Java 的原生类型如int/long/char/boolean/double/float/String、CharSequence、List和Map、)、实现android.os.Parcelable 接口的对象类

    两个实例来验证一下AIDL

    1.创建一个提供AIDL服务的AIDL_Test_Server,新建AIDL接口IRemoteService,在接口中定义方法

    package cn.jsonlu.aidl.server;
    
    /**
    *远程AIDL服务接口
    **/
    interface IRemoteService {
    
        /**
        *定义接口方法
        */
        int add(int a,int b);
    }

    2.在AIDL_Test_Server中创建服务

    package cn.jsonlu.aidl.server;
    
    import android.app.Service;
    import android.content.Intent;
    import android.os.IBinder;
    import android.os.RemoteException;
    
    /**
     * Author:JsonLu
     * DateTime:2016/2/25 10:59
     * Email:jsonlu@qq.com
     * Desc:
     **/
    public class RemoteService extends Service {
    
        private IBinder iBinder = new IRemoteService.Stub() {
            @Override
            public int add(int a, int b) throws RemoteException {
                return a + b;
            }
        };
    
        @Override
        public IBinder onBind(Intent intent) {
            return iBinder;
        }
    }

    配置文件

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="cn.jsonlu.aidl.server">
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme">
            <activity
                android:name=".MainActivity"
                android:label="@string/app_name">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <service
                android:name=".RemoteService"
                android:exported="true">
                <intent-filter>
                    <action android:name="cn.jsonlu.aidl.server.IRemoteService" />
                </intent-filter>
            </service>
        </application>
    
    </manifest>

    3.创建一个使用AIDL服务的AIDL_Test_Client,将AIDL_Test_Server中的.aidl文件复制到AIDL_Test_Client中(接口包名必须一致)

    package cn.jsonlu.aidl.client;
    
    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.view.View;
    import android.widget.EditText;
    
    import cn.jsonlu.aidl.server.IRemoteService;
    
    public class MainActivity extends Activity {
    
        private EditText a, b, c;
        private IRemoteService aidl;
        private boolean bindFlag = false;
        private ServiceConnection conn = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                aidl = IRemoteService.Stub.asInterface(service);
            }
    
            @Override
            public void onServiceDisconnected(ComponentName name) {
                aidl = null;
            }
        };
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            init();
            bindService();
        }
    
        private void init() {
            a = (EditText) findViewById(R.id.num_a);
            b = (EditText) findViewById(R.id.num_b);
            c = (EditText) findViewById(R.id.num_c);
        }
    
        public void onClick(View v) {
            if (!bindFlag) {
                bindService();
            } else {
                int sum = 0;
                try {
                    sum = aidl.add(Integer.parseInt(a.getText().toString()), Integer.parseInt(b.getText().toString()));
                } catch (RemoteException e) {
                    System.out.println("AIDL错误");
                }
                c.setText(String.valueOf(sum));
            }
        }
    
        private void bindService() {
    
            Intent intent = new Intent(IRemoteService.class.getName());
            intent.setClassName("cn.jsonlu.aidl.server", "cn.jsonlu.aidl.server.RemoteService");
            bindFlag = bindService(intent, conn, BIND_AUTO_CREATE);
            if (!bindFlag) {
                System.out.println("AIDL未绑定成功");
            }
    
            /*
            //打开其他APP页面
            Intent intent = new Intent(Intent.ACTION_MAIN);
            intent.addCategory(Intent.CATEGORY_LAUNCHER);
            ComponentName cn = new ComponentName("cn.jsonlu.aidl.server", "cn.jsonlu.aidl.server.MainActivity");
            intent.setComponent(cn);
            startActivity(intent);
            */
    
        }
    }

     4.AIDL传递对象需要实现Parcelable接口

    新建Bean实体类

    package cn.jsonlu.aidl.server;
    
    import android.os.Parcel;
    import android.os.Parcelable;
    
    /**
     * Author:JsonLu
     * DateTime:2016/2/25 13:33
     * Email:jsonlu@qq.com
     * Desc:
     **/
    public class Person implements Parcelable {
    
    
        private int age;
        private String name;
    
        public Person(int age, String name) {
            this.age = age;
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        protected Person(Parcel in) {
            readFromParcel(in);
        }
    
        public static final Creator<Person> CREATOR = new Creator<Person>() {
            @Override
            public Person createFromParcel(Parcel in) {
                return new Person(in);
            }
    
            @Override
            public Person[] newArray(int size) {
                return new Person[size];
            }
        };
    
        @Override
        public int describeContents() {
            return 0;
        }
    
        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeString(name);
            dest.writeInt(age);
        }
    
        //注意读取变量和写入变量的顺序应该一致 不然得不到正确的结果
        public void readFromParcel(Parcel source) {
            name = source.readString();
            age = source.readInt();
        }
    }

    新建Person.aidl文件

    // Person.aidl
    package cn.jsonlu.aidl.server;
    parcelable Person;

    修改IRemoteService.aidl文件

    // IRemoteService.aidl
    package cn.jsonlu.aidl.server;
    import cn.jsonlu.aidl.server.Person;
    // Declare any non-default types here with import statements
    
    interface IRemoteService {
        //计算两数的和
        int add(int a,int b);
        //传递对象
        Person getPerson();
    }
  • 相关阅读:
    第十五篇 -- 学习第十四天打卡20190702
    第三篇 -- 方向
    第十四篇 -- 学习第十三天打卡20190701
    yum更换阿里源
    Jenkins+sonar7.3集成
    xshell 5 书写汉字乱码
    zabbix 短信报警
    zabbix 微信报警
    zabbix邮件报警
    zabbix主动监测客户端设置
  • 原文地址:https://www.cnblogs.com/Jsonlu/p/5216716.html
Copyright © 2011-2022 走看看