Binder之AIDL进程间通信的使用(附源码)

Maren ·
更新时间:2024-11-13
· 994 次阅读

废话不多说,先看代码,再讲原理。
首先我们先搞两个进程出来,一个作为客户端(client)一个作为服务端(service)。

在客户端和服务的分别创建一个AIDL接口,可以用如下方式进行创建,需要注意的是,两端创建的接口必须保证完全一致,包括他们的包名,这里的包名可能需要手动去修改一下,不一致的话运行时会抛出如下异常 “Binder invocation to an incorrect interface” 。

接下来我们来写客户端,直接一个在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; } }; }

运行结果:

原创文章 2获赞 3访问量 41 关注 私信 展开阅读全文
作者:魔法少女厄加特~



aidl binder 通信 源码

需要 登录 后方可回复, 如果你还没有账号请 注册新账号