通信之进程间通信-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应用程序AIDLServeDemo2,新建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应用程序AIDLClientDemo2,在程序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
相关文章推荐
- AIDL介绍和实例讲解
- 深入理解TAILQ队列(转自http://blog.csdn.net/hunanchenxingyu/article/details/8648794)
- (110) Connection timed out的错HttpClient 每次请求未close导致 Nginx connect failed (110- Connection timed out)
- 在MainActivity的内部静态类PlaceholderFragment 类中的onCreateView中获取fragment_main.xml中控件
- 关于AI的目标导向型行动计划
- 游戏人工智能开发之6种决策方法
- STL 之随机访问迭代器 http://blog.csdn.net/tangaowen/article/details/7515558
- 使用stl中的 advance和 distance 方法来进行iterator的加减 http://blog.csdn.net/tangaowen/article/details/7515558
- 置顶] 简单的程序诠释C++ STL算法系列之十三:copy http://blog.csdn.net/jerryjbiao/article/details/7376088
- Better Business Grammar Train Summary
- gitlab push时报错error:failed to push some refs to 'git@xxx.xx.xx.xxx:xxxx/xxx.git'
- 【Lintcode】Restore IP Addresses, Number of Airplanes in the Sky
- 无法解决 equal to 运算中 "Chinese_PRC_CI_AS" 和 "Chinese_PRC_90_CI_AI" 之间的排序规则冲突。的解决方法
- LeetCode 217. Contains Duplicate
- Failed to locate or generate matchin signing assets
- process launch failed: Security
- Spark技术内幕:Master基于ZooKeeper的High Availability(HA)源码实现
- Login with RMAN immediately fails with ORA-04031, ORA-06508
- HackerRank "Training the army" - Max Flow
- Something about the microsoft HttpContext domain design