概述
废话不多说,先看代码,再讲原理。
首先我们先搞两个进程出来,一个作为客户端(client)一个作为服务端(service)。
在客户端和服务的分别创建一个AIDL接口,可以用如下方式进行创建,需要注意的是,两端创建的接口必须保证完全一致,包括他们的包名,这里的包名可能需要手动去修改一下,不一致的话运行时会抛出如下异常 “Binder invocation to an incorrect interface” 。
创建完接口之后我们点击一下下面这个锤子,来打造一下这个工程,这样在build目录下就会自动生成我们需要的文件了。
我的AIDL接口是这么定义的:
interface IMyAidlInterface {
void sendMessage(in String msg);
String getMessage();
}
定义完接口之后我们去服务端启动一个服务,直接在MainActivity里启动
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startService(new Intent(this, AiService.class));
}
}
service的内容也很简单,直接在onBind的时候处理就好了
public class AiService extends Service {
private static final String TAG = "AiService";
private String message;
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.d(TAG, "onBind: ");
return iBinder;
}
private IBinder iBinder = new IMyAidlInterface.Stub() {
@Override
public void sendMessage(String msg) throws RemoteException {
message = " "+msg +" " + "被service处理了";
Log.d(TAG, "sendMessage: "+msg);
}
@Override
public String getMessage() throws RemoteException {
Log.d(TAG, "getMessage: "+message);
return message;
}
};
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate: ");
}
}
做完这些服务端就完成了,不要忘记在清单文件中添加我们的服务,并设置可以为其他进程所利用
<service android:name=".service.AiService"
android:exported="true"/>
接下来我们来写客户端,直接一个在activity使用,这个代码结构就非常简单了,我们在这个进程中发送一个字符串,然后在service进程对这个字符串处理,处理完成后我们再获取处理后的字符串,实现一个这么简单的功能。
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private IMyAidlInterface myAidl;
private Button bt;
private TextView tv;
private EditText et;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
bindService();
}
private void initView() {
bt = (Button)findViewById(R.id.button);
tv = (TextView)findViewById(R.id.message);
et = (EditText)findViewById(R.id.et_1);
bt.setOnClickListener(v -> {
Log.d(TAG, "initView: bt按了" );
try {
myAidl.sendMessage(et.getText().toString());
tv.setText(myAidl.getMessage());
} catch (RemoteException e) {
e.printStackTrace();
}
});
}
private void bindService() {
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.tiancong.myaidl1","com.tiancong.myaidl1.service.AiService"));
bindService(intent,serviceConnection, Context.BIND_AUTO_CREATE);
}
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.d(TAG, "onServiceConnected: ");
myAidl = IMyAidlInterface.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
myAidl = null;
}
};
}
运行结果:
这样我们就完成了进程间的通信。下面附上源码,如果对AIDL的使用还有什么不理解欢迎关注我的微信公众号,我们来一起进行讨论。
最后
以上就是可爱世界为你收集整理的Binder之AIDL进程间通信的使用(附源码)的全部内容,希望文章能够帮你解决Binder之AIDL进程间通信的使用(附源码)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复