AIDL 进程间通信的一个小小的总结

需求

  项目需要,将做好的项目作为一个服务提供给另一个公司。我们需要提供一个apk,所以设计到进程间交互,不得不了解一下AIDL了。

了解一下AIDL

  之前准备面试的时候,或多或少的了解了一点AIDL,不过现在忘记得差不多了。

  所以网上随便找了几篇不错的文章。

  1.进程通信之AIDL的使用。

  2.学习AIDL,这一篇就够了。

一个简单的demo

  自己搞了一个简单的demo。

  实现了进程间通信,可以传输普通类型和实体类型。

  首先是服务端。

  1.第一个aidl接口。

// IMyAidlInterface.aidl
package com.xf.test1;

import com.xf.test1.IAidlCallBack;
import com.xf.test1.Entity;
// Declare any non-default types here with import statements

interface IMyAidlInterface {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
            double aDouble, String aString);


    String getStr(String str);

    int getPid();

    Entity getEntity();

    Entity setEntity(in Entity entity);

    void registerCallBack(IAidlCallBack callback);

    void unregisterCallBack(IAidlCallBack callback);
}
View Code

  2.第二个aidl接口。

// IAidlCallBack.aidl
package com.xf.test1;

import com.xf.test1.Entity;

// Declare any non-default types here with import statements

interface IAidlCallBack {

    void callBack(String name);

    void callBackEntity(in Entity entity);
}
View Code

  3.第三个aidl接口。

// Person.aidl
package com.xf.test1;

parcelable Entity;
View Code

  4.封装的一个IBinder。

package com.xf.test1;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;

public class AIDLService extends Service {


    private AIDLImp mBinder;


    @Override
    public void onCreate() {
        super.onCreate();
        mBinder = new AIDLImp(this);
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }


    @Override
    public void onDestroy() {
        super.onDestroy();
        mBinder.KillAll();
    }
}
View Code

  5.AIDL服务。

package com.xf.test1;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;

public class AIDLService extends Service {


    private AIDLImp mBinder;


    @Override
    public void onCreate() {
        super.onCreate();
        mBinder = new AIDLImp(this);
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }


    @Override
    public void onDestroy() {
        super.onDestroy();
        mBinder.KillAll();
    }
}
View Code

  6.实体类型。

package com.xf.test1;

import android.os.Parcel;
import android.os.Parcelable;

/**
 * Description: 简单实体类
 *
 * @version V1.0.0
 * Createdate: 2018/6/22
 * @author: wja [email protected]
 */
public class Entity implements Parcelable {

    private String name;

    private int parameter1;

    private double parameter2;

    public Entity(String name){
        this.name=name;
    }

    public Entity(String name, int parameter1, double parameter2) {
        this.name = name;
        this.parameter1 = parameter1;
        this.parameter2 = parameter2;
    }

    public int getParameter1() {
        return parameter1;
    }

    public void setParameter1(int parameter1) {
        this.parameter1 = parameter1;
    }

    public double getParameter2() {
        return parameter2;
    }

    public void setParameter2(double parameter2) {
        this.parameter2 = parameter2;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(this.name);
        dest.writeInt(this.parameter1);
        dest.writeDouble(this.parameter2);
    }

    protected Entity(Parcel in) {
        this.name = in.readString();
        this.parameter1 = in.readInt();
        this.parameter2 = in.readDouble();
    }

    public static final Creator<Entity> CREATOR = new Creator<Entity>() {
        @Override
        public Entity createFromParcel(Parcel source) {
            return new Entity(source);
        }

        @Override
        public Entity[] newArray(int size) {
            return new Entity[size];
        }
    };

    @Override
    public String toString() {
        return "Entity{" +
                "name='" + name + '\'' +
                ", parameter1=" + parameter1 +
                ", parameter2=" + parameter2 +
                '}';
    }
}
View Code

  7.清单文件。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xf.test1">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <!--<intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />

                <data android:scheme="com.xf.aidl.test" />
            </intent-filter>-->
        </activity>


        <service android:name=".AIDLService">
            <intent-filter>
                <action android:name="com.xf.aidl" />
                <category android:name="android.intent.category.DEFAULT" />
                <!--<action android:name="android.intent.action.MAIN" />-->

                <!--<category android:name="android.intent.category.LAUNCHER" />-->
            </intent-filter>
        </service>
    </application>

</manifest>
View Code

  8.服务端如何运行(不使用启动图标的方式)

猜你喜欢

转载自www.cnblogs.com/Jason-Jan/p/9214570.html