以前也使用过aidl,但是项目的aidl都是已经创建好的,只需要自己添加方法实现两个apk之间通信。
这次自己使用android studio实现两个apk的通信,在mainActivity中调用aid接口在service中弹一个toast.
1 首先建一个项目 生成一个主进程 Mainactivity , 然后再添加一个继承service的类,这里面需要将AndroidManifest.xml 文件改为如下:
<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" />
</intent-filter>
</activity>
<service
android:name=".MyService"
android:process=":remote">
</service>
</application>
```
2 我开始想做个用aidl传递参数 --》继承自Parcelable的子类作为参数。但是发现编译不过。这个后面有大佬解决@我一下。
package com.example.lisiwei.parcelableandaidl;
import android.os.Parcel;
import android.os.Parcelable;
public class MyParcelable implements Parcelable {
private int mId = 0;
private String mTaskName = null;
public MyParcelable(){
super();
}
public MyParcelable(int id, String taskName) {
super();
this.mId = id;
this.mTaskName = taskName;
}
public void setId(int id) {
this.mId = id;
}
public void setTaskName(String taskName) {
this.mTaskName = taskName;
}
public int getId() {
return this.mId;
}
public String getTaskName() {
return this.mTaskName;
}
@Override
public int describeContents() {
return 0;
}
// 序列化
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeInt(this.mId);
parcel.writeString(this.mTaskName);
}
// 反序列化
public static final Parcelable.Creator<MyParcelable> CREATOR = new Parcelable.Creator<MyParcelable>() {
@Override
public MyParcelable createFromParcel(Parcel parcel) {
return new MyParcelable(parcel.readInt(), parcel.readString());
}
@Override
public MyParcelable[] newArray(int i) {
return new MyParcelable[i];
}
};
}
3 继承自service类的MyService, 这个就是后面和Mainactivity用aidl来通信的service类,使用的时候先将service和Mainactivity绑定。
package com.example.lisiwei.parcelableandaidl;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.os.Looper;
import android.os.RemoteException;
import android.util.Log;
import android.widget.Toast;
public class MyService extends Service {
private IMyAidlInterface iMyAidlInterface = null;
private Context mContext = null;
private MyParcelable myParceString = null;
private String str = null;
private int i = 0;
public MyService() {
}
@Override
public void onCreate() {
super.onCreate();
mContext = this;
// 实例化aidl接口
iMyAidlInterface = new IMyAidlInterface.Stub() {
@Override
public void show() throws RemoteException {
Log.d(MainActivity.TAG, "MyService show() start ");
try{
Toast.makeText(mContext,str,Toast.LENGTH_LONG).show();
}catch (Exception e) {
Looper.prepare();
Toast.makeText(mContext,str,Toast.LENGTH_LONG).show();
Looper.loop();
}
}
};
}
// Mainactivity 绑定 service的时候会调用onBind返回给onServiceConnected(ComponentName componentName, IBinder iBinder) 中的参数IBinder.
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
return (IBinder) iMyAidlInterface;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 在MainActivity中序列化MyPracelable 用Internet传递过来
myParceString = intent.getParcelableExtra("lisiwei");
str = myParceString.getTaskName();
i = myParceString.getId();
return super.onStartCommand(intent, flags, startId);
}
// 解绑
@Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}
}
4 MainActivity类
package com.example.lisiwei.parcelableandaidl;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private IMyAidlInterface iMyAidlInterface = null;
private Button mButton = null;
private Intent mIntent = null;
public final static String TAG = "lisiwei";
// 实例化 ServiceConnection 对象,等会绑定成功就会调用onServiceConnected,然后得到参数iBinder,来自Service中onBind的返回值。
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
iMyAidlInterface = (IMyAidlInterface) IMyAidlInterface.Stub.asInterface(iBinder);
}
//解绑的时候调用
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mIntent = new Intent(this, MyService.class);
// intent put序列化
mIntent.putExtra("lisiwei", new MyParcelable(1, "first toast"));
startService(mIntent);
// 绑定mainActivity和service
bindService(mIntent,serviceConnection,Context.BIND_AUTO_CREATE);
init();
}
public void init() {
mButton = findViewById(R.id.myButton);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try{
iMyAidlInterface.show();
}catch (Exception e){
}
}
});
}
}
5 aidl接口 IMyAidlInterface
// IMyAidlInterface.aidl
package com.example.lisiwei.parcelableandaidl;
//import com.example.lisiwei.parcelableandaidl.MyParcelable;
// 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 show();
}