通信之进程间通信-AIDL

来源:互联网 发布:沈阳医疗软件代理 编辑:程序博客网 时间:2024/05/17 08:57

AIDL定义

aidl:英文全称为Android interface definition language,即Android接口定义语言。能够实现两个独立应用程序之间的通信。进行跨进程通信


AIDL用法

既然是两个进程间的通信,那就必须要创建两个Android应用程序,一个应用程序A借助service用来实现所定义的aidl接口,另一个应用程序B用来绑定A应用程序中所创建的服务,并调用aidl接口方法。假定,绑定服务的应用程序为客户端Client,定义服务的为服务端Server。


服务端编程步骤:

1,新建Android应用程序AIDLServeDemo

2,新建CustomAIDL.aidl,至于新建过程,参考下文客户端的编程。

3,服务端可以不创建用户界面,创建服务:

package com.example.server;import com.example.aidlService.CustomAIDL;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.os.RemoteException;import android.widget.Toast;public class AIDLServer extends Service {CustomAIDL.Stub stub = new CustomAIDL.Stub() {@Overridepublic String sayHello(String string) throws RemoteException {// TODO Auto-generated method stubreturn "sayHello:"+string;}};@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();}@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn stub;}@Overridepublic boolean onUnbind(Intent intent) {// TODO Auto-generated method stubreturn super.onUnbind(intent);}@Overridepublic void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();}}

4,在清单配置文件中配置服务

<service android:name="com.example.server.AIDLServer">            <intent-filter >                <action android:name="action.aidlserver"/>                <category android:name="category.aidlserver"/>            </intent-filter>        </service>

 至此,服务端程序编写完毕,目录结构如下:


客户端编程步骤:

1,新建Android应用程序AIDLClientDemo

2,在程序src/某包目录下新建文件,New-file,文件名称为CustomAIDL.aidl。注意,连同.aild一同写到文件名处

客户端程序和服务端程序所创建的.aidl文件,必须,包名一致,文件名一致,即文件中的内容必须一致。

3,编辑所创建的CustomAIDL.aidl文件,写法与java相同,指明所在包,以及方法

package com.example.aidlService;   interface CustomAIDL{      String sayHello (String string); }
4,在aidl文件保存后,Eclipse中的adt插件会帮助你自动的在gen目录下生成对应的java文件,目录结构如下:

5,在activity中使用aidl进行进程间通信

package com.example.aidlclientdemo;import com.example.aidlService.CustomAIDL;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.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends Activity implements OnClickListener {private TextView mBindServiceTv;private TextView mUnBindServiceTv;private TextView mSayHelloTv;private CustomAIDL mAidl;private ServiceConnection conn = new ServiceConnection() {@Overridepublic void onServiceDisconnected(ComponentName name) {// TODO Auto-generated method stub}@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {// TODO Auto-generated method stubmAidl = CustomAIDL.Stub.asInterface(service);}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();}/** * 初始化控件 */private void initView() {mBindServiceTv = (TextView) findViewById(R.id.bind_service_tv);mUnBindServiceTv = (TextView) findViewById(R.id.unbind_service_tv);mSayHelloTv = (TextView) findViewById(R.id.send_msg);setViewOnClickListener(mBindServiceTv, mUnBindServiceTv,mSayHelloTv);setBtnFlags(true, false,false);}/** * 为控件添加点击事件 *  * @param views */private void setViewOnClickListener(View... views) {for (View view : views) {if (view != null) {view.setOnClickListener(this);}}}/** * 设置按钮的可点击状态 * @param bindService * @param unbindService */    private void setBtnFlags(boolean bindService,boolean unbindService,boolean sayhello){    mBindServiceTv.setEnabled(bindService);    mUnBindServiceTv.setEnabled(unbindService);    mSayHelloTv.setEnabled(sayhello);    }@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch (v.getId()) {case R.id.unbind_service_tv://服务解绑unbindService(conn);setBtnFlags(true, false,false);break;case R.id.bind_service_tv://绑定服务bindService(new Intent("action.aidlserver"), conn, BIND_AUTO_CREATE);setBtnFlags(false, true,true);break;case R.id.send_msg://进程间通信if (mAidl != null) {try {String str = mAidl.sayHello("hello,world");Toast.makeText(getApplicationContext(), str,                                               Toast.LENGTH_SHORT).show();} catch (RemoteException e) {// TODO Auto-generated catch blocke.printStackTrace();}}break;default:break;}}}

AIDL进程间通信效果图

                                                     


Android5.0以后隐式启动ServiceBug





1 0
原创粉丝点击