Aidl实现跨进程通信小例子
2016-03-18 23:39
471 查看
首先,先看一下Services端目录结构:
![](http://img.blog.csdn.net/20160318233921027?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
先在src目录下创建一个文件,命名为Count.aidl 此时在gen目录下就会自动创建一个Count.java文件,把这个文件复制到Client项目的src文件下即可。
Service短的代码如下:
<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端代码如下:
![](http://img.blog.csdn.net/20160318235017620?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
如果连接成功,输入数字,点击计算就可以看到结果了。
先在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的界面显示如下:
如果连接成功,输入数字,点击计算就可以看到结果了。
相关文章推荐
- UVa 10976 - Fractions Again?!
- 不能在析构函数里面抛出异常 http://blog.csdn.net/wind19/article/details/8213406
- RAID各级别特性
- HDU5046 Airport dancing links 重复覆盖+二分
- Starting httpd: httpd: apr_sockaddr_info_get() failed for subversion
- fail-fast机制
- 开发板mount宿主机出现提示:mount: nfs mount failed: Bad file descriptor的解决方案
- Failed to create an IPC Port: 拒绝访问
- GCJ 2008 APAC local onsites C Millionaire
- 219. Contains Duplicate II
- 172. Factorial Trailing Zeroes
- Pairs Forming LCM 素数筛和素因子分解
- RAID详解
- 70. Climbing Stairs
- 深入分析AIDL原理
- 217. Contains Duplicate
- 知乎日报(Know almost daily chrome version)
- 知乎日报(Know almost daily chrome version)
- 删除 除了main.mp4以外的全部文件的脚本
- HibernateException: Could not obtain transaction-synchronized Session for current thread 的解决方法。