您的位置:首页 > 大数据 > 人工智能

通信之进程间通信-AIDL

2016-02-17 17:04 387 查看

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() {

@Override
public String sayHello(String string) throws RemoteException {
// TODO Auto-generated method stub
return "sayHello:"+string;
}
};

@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
}

@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return stub;
}

@Override
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
return super.onUnbind(intent);
}

@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.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() {

@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub

}

@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
mAidl = CustomAIDL.Stub.asInterface(service);
}
};

@Override
protected 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);
}

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (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 block
e.printStackTrace();
}
}

break;
default:
break;
}
}
}


AIDL进程间通信效果图


                           

                          


Android5.0以后隐式启动ServiceBug

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: