AIDL的简单使用
1 AIDL(Android Interface Definition Language):接口定义语言。
2 当需要在不同的进程之间传递对象时,比如在不同的应用之间传递对象的时候,就需要使用AIDL。
3 AID使得一个应用能够调用另一个应用的服务。
一、 服务端应用(其实就一个提供服务的应用)
1 创建AIDL文件
这里用的开发工具是Android Studio,在main文件夹下创建aidl文件夹,和java文件夹同级,在aidl文件夹中创建包,包名与应用包名必须一致,最后创建aidl文件:PeopleServiceAIDL.aidl
package com.miquan.demo; // AIDL其实就是一个接口,定义了通讯的规则。 interface PeopleServiceAIDL { String findPeople(int num); }
此时点击Android Studio菜单中的Build > Make Module xxx,然后就会生成一个对应的类了。具体位置:build > generated > source > aidl > debug > xxx
2 创建Service
PeopleService.java
package com.miquan.demo; import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.os.RemoteException; public class PeopleService extends Service { private IBinder mBinder = new PeopleServiceBinder(); public PeopleService() { } @Override public IBinder onBind(Intent intent) { return mBinder; } private final class PeopleServiceBinder extends PeopleServiceAIDL.Stub { @Override public String findPeople(int num) throws RemoteException { return num == 0 ? "王尼玛" : "唐马儒"; } } }
在清单文件中配置Service(用隐式启动):
<service android:name=".PeopleService"> <intent-filter> <action android:name="com.miquan.demo.people.service"/> </intent-filter> </service>
至此服务端完成了。
二、 客户端(调用端)
首先要以同样的方法创建aidl文件,或者复制过来,要对应的。
package com.miquan.as3; import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; import android.view.View; import android.widget.Button; import com.miquan.demo.PeopleServiceAIDL; public class MainActivity extends Activity { private Button mButton; private PeopleServiceAIDL mPeopleServiceAIDL; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mButton = (Button) findViewById(R.id.button); mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { // 这里得到的name就是从另外一个应用中的服务得到的 String name = mPeopleServiceAIDL.findPeople(0); } catch (RemoteException e) { e.printStackTrace(); } } }); bindService(new Intent("com.miquan.demo.people.service"), mServiceConnection, BIND_AUTO_CREATE); } private ServiceConnection mServiceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mPeopleServiceAIDL = PeopleServiceAIDL.Stub.asInterface(service); } @Override public void onServiceDisconnected(ComponentName name) { mPeopleServiceAIDL = null; } }; @Override protected void onDestroy() { super.onDestroy(); unbindService(mServiceConnection); } }