AI智能
改变未来

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

废话不多说,先看代码,再讲原理。
首先我们先搞两个进程出来,一个作为客户端(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 {@Overrideprotected 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@Overridepublic IBinder onBind(Intent intent) {Log.d(TAG, \"onBind: \");return iBinder;}private IBinder iBinder = new IMyAidlInterface.Stub() {@Overridepublic void sendMessage(String msg) throws RemoteException {message = \"  \"+msg +\"  \" + \"被service处理了\";Log.d(TAG, \"sendMessage: \"+msg);}@Overridepublic String getMessage() throws RemoteException {Log.d(TAG, \"getMessage: \"+message);return message;}};@Overridepublic 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;@Overrideprotected 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() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {Log.d(TAG, \"onServiceConnected: \");myAidl = IMyAidlInterface.Stub.asInterface(service);}@Overridepublic void onServiceDisconnected(ComponentName name) {myAidl = null;}};}

运行结果:


这样我们就完成了进程间的通信。下面附上源码,如果对AIDL的使用还有什么不理解欢迎关注我的微信公众号,我们来一起进行讨论。

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » Binder之AIDL进程间通信的使用(附源码)