IPC机制 : AIDL的用法
HeiMcMullan
8年前
<p>(AS开发工具)</p> <h2><strong>服务器端</strong></h2> <p><strong>第一步 :创建aidl文件</strong></p> <ul> <li> <p>在与java文件夹同级目录下,创建文件夹 aidl ,然后在aidl文件夹下创建包 com.lyp.aidl ,再在包下创建 IMyAidlInterface.aidl 文件</p> </li> </ul> <p style="text-align:center"><img src="https://simg.open-open.com/show/a8c1846cafcb1cdbca032c66ce751cc4.png"></p> <p style="text-align:center">Paste_Image.png</p> <pre> <code class="language-java">// IMyAidlInterface.aidl package com.lyp.aidl; // Declare any non-default types here with import statements interface IMyAidlInterface { /** * 1.接口和方法前不用加private等访问权限的修饰符,当然也不能使用final,static修饰符 * 2.接口名称和aidl的名称要一致 * 3.aidl默认支持的类型包话java基本类型(int、long、boolean)和(String、List、Map、CharSequence), * 使用这些类型时不需要import声明。对于List和Map中的元素类型必须是Aidl支持的类型。如果使用自定义类型 * 作为参数或返回值,自定义类型必须实现Parcelable接口 * 4.自定义类型和AIDL生成的其它接口类型在aidl描述文件中,应该显式import,即便在该类和定义的包在同一个包中 * 5.在aidl文件中所有非Java基本类型参数必须加上in、out、inout标记,以指明参数是输入参数、输出参数还是输入输出参数 */ int add(int num1, int num2); }</code></pre> <ul> <li>使用as工具栏Build/make project ,重新编译 ,生成与aidl文件同名的java文件</li> </ul> <p style="text-align:center"><img src="https://simg.open-open.com/show/d24c7d09509609ed6c597db3012d6bf2.png"></p> <p style="text-align:center">Paste_Image.png</p> <p><strong>第二步 : 完成服务器端Server类</strong></p> <pre> <code class="language-java">package com.lyp.aidlserver; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.os.RemoteException; import android.support.annotation.Nullable; import com.lyp.aidl.IMyAidlInterface; /** * Created by ${思格斯} on 2016/10/8 0008. */ public class AidlService extends Service { public AidlService() { } @Nullable @Override public IBinder onBind(Intent intent) { return mBinder; } //获取IMyAidlInterface.Stub对象,实现IMyAidlInterface.java中的add方法 private IBinder mBinder= new IMyAidlInterface.Stub() { @Override public int add(int num1, int num2) throws RemoteException { return num1+num2; } }; }</code></pre> <h2><strong>客户端</strong></h2> <p><strong>第一步 : 将服务器端的aidl文件夹复制一份到客户端</strong></p> <p style="text-align:center"><img src="https://simg.open-open.com/show/ed583c9cb73cb1256958ab149136ba6c.png"></p> <p style="text-align:center">Paste_Image.png</p> <p><strong>第二步 : 绑定服务端Service , 获取代理对象 ,调用aidl文件自动定义的方法</strong></p> <pre> <code class="language-java">package com.lyp.aidlclient; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.IBinder; import android.os.RemoteException; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import com.lyp.aidl.IMyAidlInterface; public class MainActivity extends AppCompatActivity { private TextView mTextView; private Button mButton; private IMyAidlInterface mBinder; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextView = (TextView) findViewById(R.id.text); mButton= (Button) findViewById(R.id.btn); bindService(); //调用服务端方法 mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { int res = mBinder.add(1, 1); mTextView.setText(String.valueOf(res)); } catch (RemoteException e) { e.printStackTrace(); } } }); } //显式绑定服务 private void bindService() { Intent intent = new Intent("android.intent.action.AIDLSERVICE"); intent.setPackage("com.lyp.aidlserver"); bindService(intent, conn, BIND_AUTO_CREATE); } ServiceConnection conn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { //获取远程服务代理 mBinder = IMyAidlInterface.Stub.asInterface(service); } @Override public void onServiceDisconnected(ComponentName name) { //释放资源 mBinder = null; } }; @Override protected void onDestroy() { super.onDestroy(); //解绑服务 unbindService(conn); } }</code></pre> <p> </p> <p>来自:http://www.jianshu.com/p/e84bdb4cf28a</p> <p> </p>