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

Aidl实现跨进程通信小例子

2016-03-18 23:39 471 查看
首先,先看一下Services端目录结构:



先在src目录下创建一个文件,命名为Count.aidl 此时在gen目录下就会自动创建一个Count.java文件,把这个文件复制到Client项目的src文件下即可。

Service短的代码如下:

public class MyServer extends Service {

class Mylocation extends Count.Stub{
@Override
public double count(double a, double b) throws RemoteException {
return a+b;
}
}
@Override
public IBinder onBind(Intent intent) {
return new Mylocation();
}
@Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}
}
此时要在AndroidManifest.xml中注册:

<service android:name="com.zhongyan.server.MyServer" android:process=":remote" android:exported="true" >

<intent-filter>

<action android:name="com.zhongyan.server.bindServer"/>

</intent-filter>

</service>

切记跨进程通信一定要加这个属性 android:exported="true" ,该属性用来标示,其它应用的组件是否可以唤醒service或者和这个service进行交互:true可以,false不可以。如果为false,只有同一个应用的组件或者有着同样user ID的应用可以启动这个service或者绑定这个service。

Client端代码如下:

public class MainActivity extends Activity {
private Button btnCalculate;
private EditText etNum1;
private EditText etNum2;
private TextView tvResult;
private Count mcount;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etNum1 = (EditText) findViewById(R.id.et_num_one);
etNum2 = (EditText) findViewById(R.id.et_num_two);

tvResult = (TextView) findViewById(R.id.tv_result);
btnCalculate = (Button) findViewById(R.id.btn_cal);

Intent intent = new Intent();
intent.setAction("com.zhongyan.server.bindServer");
intent.setPackage("com.zhongyan.serveraidl");
bindService(intent,connection,Context.BIND_AUTO_CREATE);
btnCalculate.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {

try {
double num1 = Double.parseDouble(etNum1.getText().toString());
double num2 = Double.parseDouble(etNum2.getText().toString());
String result;
if (mcount!= null){
result = "计算结果:"+ mcount.count(num1, num2);
tvResult.setText(result);
}

} catch (RemoteException e) {
e.printStackTrace();
}
}
});
}
private ServiceConnection connection = new ServiceConnection() {

@Override
public void onServiceDisconnected(ComponentName name) {
mcount = null;
}

@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mcount = Count.Stub.asInterface(service);
}
};
}
Client的界面显示如下:



如果连接成功,输入数字,点击计算就可以看到结果了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: