需求
项目需要,将做好的项目作为一个服务提供给另一个公司。我们需要提供一个apk,所以设计到进程间交互,不得不了解一下AIDL了。
了解一下AIDL
之前准备面试的时候,或多或少的了解了一点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); }
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); }
3.第三个aidl接口。
// Person.aidl package com.xf.test1; parcelable Entity;
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(); } }
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(); } }
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 + '}'; } }
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>
8.服务端如何运行(不使用启动图标的方式)