最近有需求要实现两个apk之间的通信,想到用AIDL来实现,现写一个demo学习下AIDL如何使用。
这里我要实现一个apk(client端)调用另一个apk(server端)的方法.
先实现server端,代码结构如下
AIDL文件内容如下:
package com.example.testaidl;
interface MyInterface {
void testMethod();
}
MainActivity.java
package com.example.testaidlserver;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startService(new Intent(this, MyService.class));
}
}
MyService.java
package com.example.testaidlserver;
import com.example.testaidl.MyInterface;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
public class MyService extends Service {
@Override
public IBinder onBind(Intent intent) {
Log.i("MyService", "service onBind....");
return new ImplAIDLService();
}
private class ImplAIDLService extends MyInterface.Stub {
@Override
public void testMethod() throws RemoteException {
Log.i("MyService", "testMode invoked");
}
}
}
Manifest中添加MyService的注册
<service android:name="com.example.testaidlserver.MyService">
<intent-filter>
<action android:name="com.example.testaidlserver.MyService"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</service>
下面是Client端的
aidl文件和server端的要一样
package com.example.testaidl;
interface MyInterface {
void testMethod();
}
MainAcitvity的功能是,绑定server端的service,调用server端的方法
package com.example.testaidlclient;
import com.example.testaidl.MyInterface;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
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.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity implements OnClickListener {
private boolean mIsBinded = false;
private MyInterface mInterface;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn_bind = (Button)findViewById(R.id.btn_bind);
btn_bind.setOnClickListener(this);
Button btn_invoke = (Button)findViewById(R.id.btn_invoke);
btn_invoke.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch(v.getId()) {
case R.id.btn_bind:
if(mIsBinded) {
unbindService(con);
}else {
bindService(new Intent("com.example.testaidlserver.MyService"), con, Context.BIND_AUTO_CREATE);
}
break;
case R.id.btn_invoke:
try {
mInterface.testMethod();
} catch (RemoteException e) {
e.printStackTrace();
}
break;
}
}
ServiceConnection con = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
mIsBinded = false;
mInterface = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mIsBinded = true;
mInterface = MyInterface.Stub.asInterface(service);
}
};
}
运行结果: