一.IPC概念
IPC(interprocess communication):
是指进程间通信,不同操作系统都有自己的一套IPC机制。
Android中通过Binder和socket来进程间的通信。
如在Linux操作系统可以通过管道、信号量、消息队列、内存共享、套接字等进行进程间通信。
若在一个应用,可给四大组件在AndroidMenifest中指定android:process属性来实现不同的组件在不同进程中运行。
AIDL简介:
Android Interface Definition Language的缩写,AIDL是一种IDL接口定义语言,用于生成可在Android设备上两个进程之间进行IPC的代码。
如在一个进程中(如Activity)要调用另一个进程中(如Service)对象的操作,就可用AIDL生成可序列化的参数。
AIDL IPC机制是面向接口的,像COM或Corba一样,但是更加轻量级。它是使用代理类在客户端和实现端传递数据。
AIDL语法规则:
默认情况下AIDL支持以下数据类型:
• 所有Java的基本数据类型(如 int, long,double, char, boolean等)
• String和CharSequence
• List:AIDL实际接收到的是ArrayList,并且List里面所有元素都必须被AIDL支持
• Map: AIDL实际接收到的是HashMap,并且Map里面所有元素都必须被AIDL支持
如果不是上面所述类型,我们必须要显示import进来,即使他们在同一个包中。
当使用自定义的对象时必须实现Parcelable接口,Parcelable为对象序列化接口,效率比实现Serializable接口高。并且新建一个与该类同名的AIDL文件,声明他为Parcelable类型。
定义AIDL接口的注意点:
• 方法可以有多个或没有参数,可以有返回值也可以为void
• 在参数中,除了基本类型以外,我们必须为参数标上方向in, out, 或者 inout
• 在AIDL文件中只支持方法,不支持静态常量
二. AIDL用法:
1. 生成AIDL文件
首先创建一个AIDL文件,在AndroidStudio中当创建一个AIDL文件时会自动为创件一个AILD文件夹,用于存放AIDL文件。创建完之后重新rebuild会自动生成aidl实现类。
在下面例子中,将Service单独作为一个应用在系统中运行,在另一个用于访问Service的client也单独作为一个应用运行在系统中。这样保证两个程序分别运行在两个进程中。
AIDL简单用法:
在Service中我们对客户端传来的两个整数做了一次加法运算并返回到客户端中。
按钮: Bind Service
按钮: UnBind Service
按钮: 2+4
AIDL代码 // ICalculate.aidl package com.ljd.aidl; // Declare any non-default types here with import statements interface ICalculate { /** * Demonstrates some basic types that you can use as parameters * and return values in AIDL. */ int add(int first, int second); }
服务端代码: package com.ljd.aidl.service; import android.app.Service; import android.os.Binder; import android.os.IBinder; import android.os.RemoteException; import com.ljd.aidl.ICalculate; public class CalculateService extends Service { public CalculateService() { } private Binder mBinder = new ICalculate.Stub(){ @Override public int add(int first, int second) throws RemoteException { return first + second; } }; @Override public IBinder onBind(Intent intent) { return mBinder; } }
客户端代码 package com.ljd.aidl.activity; import android.content.ComponentName; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import com.ljd.aidl.ICalculate; import com.ljd.aidl.client.R; public class Demo1Activity extends AppCompatActivity { private final String TAG = "DEMO1"; private boolean mIsBindService; private ICalculate mCalculate; private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { Log.d(TAG,"bind success"); Toast.makeText(Demo1Activity.this,"bind service success",Toast.LENGTH_SHORT).show(); mCalculate = ICalculate.Stub.asInterface(service); } @Override public void onServiceDisconnected(ComponentName name) { //重新绑定Service防止系统将服务进程杀死而产生的调用错误。 bindService(); } }; @Override protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_demo1); mIsBindService = false; } @Override protected void onDestroy() { unbindService(); ButterKnife.unbind(this); super.onDestroy(); } @OnClick({ R.id.bind_demo1_btn,R.id.unbind_demo1_btn,R.id.calculate_btn}) public void onClickButton(View v) { switch (v.getId()){ case R.id.bind_demo1_btn: bindService(); break; case R.id.unbind_demo1_btn: unbindService(); break; case R.id.calculate_btn: if (mIsBindService && mCalculate != null ){ try { int result = mCalculate.add(2,4); Log.d(TAG,String.valueOf(result)); } } else { Toast.makeText(this,"not bind service",Toast.LENGTH_SHORT).show(); } break; } } private void bindService(){ Intent intent = new Intent(); intent.setAction("com.ljd.aidl.action.CALCULATE_SERVICE"); bindService(intent,mConnection, Context.BIND_AUTO_CREATE); mIsBindService = true; } private void unbindService(){ if(mIsBindService){ mIsBindService = false; unbindService(mConnection); } } }
标签:IPC,复习,Service,void,aidl,AIDL,import,android From: https://www.cnblogs.com/awkflf11/p/17028678.html