Android类-Service - ADIL
2015-10-10 17:17
330 查看
1 定义AIDL接口
在src中定义AIDL接口后,Android SDK会根据定义的aidl文件在gen目录自动生成基于adil的IBinder接口的Java文件。Service端必须实现Ibinder接口,Client端能够绑定到Service,并通过Ibinder接口调用对应方法实现IPC通信。
2 创建基于AIDL的Bounded Service步骤
(1) 创建aidl文件定义一个基于java语言的.aidl文件,每个aidl文件必须定义一个单独的接口和接口声明和方法。
aidl支持的类型:
- 所有java支持的简单类型(例如:int,long,char,boolean,等)
- CharSequence(子类包括String,CharBuffer,等)
- List
List中的元素必须是支持的类型,或者AIDL生成的接口,或者声明的parcelables。List可以作为泛型使用(例如:List)。
虽然在aidl中声明的是List接口, 在另一方接受到的具体class实现总是ArrayList(ArrayList是List的一个实现)
- Map
Map中的元素和List一样,需要是支持的类型。Map不支持泛型(例如:不支持Map
3 通过IPC传递对象
如果需要通过IPC接口在进程间传递一个class,首先确保IPC通道双方都有此class,并且此class支持Parcelable接口。支持Parcelable接口可以让Android系统分解对象为primitive,可以在进程间编解码传输。创建一个支持Parcelable协议的class步骤: - 实现Parcelable接口,实现writeToParcel方法 - 增加一个静态变量CREATOR,实现Parcelable.Creator接口 - 增加一个aidl文件去声明此parceable类
4 如何调用IPC方法
- 增加aidl到src目录 - 声明Ibinder接口 - 实现ServiceConnection类,并绑定此类到Context.bindService()的参数中 - 在ServiceConnection中的onServiceConnected()中,把回调对象Ibinder转化成adil接口类 - 调用在接口中声明的方法 - 通过Context.unbindService()来断开和Service的连接
5 Demo
通过TestApp里面的UI来调用ServiceDemo App中的ADIL接口,获取ServiceDemo中的进程号。 TestApp中的界面操作:绑定服务,获取进程号,解除服务。点击按钮后,会有对应的提示。 ![Client截图](https://img-blog.csdn.net/20151010171807427)
Client端代码:
public class ServiceActivity extends Activity { Button bindButton,unbindButton,getProcessButton; myData mMyDataService; boolean mIsBound = false; private final static String ServiceTag = "ServiceActivity"; private ServiceConnection mConn = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { mMyDataService=null; } @Override public void onServiceConnected(ComponentName name, IBinder service) { mMyDataService = myData.Stub.asInterface(service); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_service); bindButton = (Button)findViewById(R.id.bind); bindButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent mIntent = new Intent(); mIntent.setAction("lewiyue.Service"); Log.i(ServiceTag, "Action : "+myData.class.getName()); bindService(mIntent, mConn, Service.BIND_AUTO_CREATE); Toast.makeText(ServiceActivity.this, "binding success", Toast.LENGTH_SHORT).show(); mIsBound = true; } }); unbindButton = (Button)findViewById(R.id.unbind); unbindButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(mIsBound){ unbindService(mConn); mIsBound = false; Toast.makeText(ServiceActivity.this, "unbinding success", Toast.LENGTH_SHORT).show(); } } }); getProcessButton = (Button)findViewById(R.id.getValue); getProcessButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(mIsBound){ try { int mProcessId = mMyDataService.getPid(); Toast.makeText(ServiceActivity.this, "Service进程号为 : "+ mProcessId, Toast.LENGTH_SHORT).show(); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } }else{ Toast.makeText(ServiceActivity.this, "请先绑定对应service", Toast.LENGTH_SHORT).show(); } } }); } }
Service端代码:
Manifest.xml 声明
<service android:name="com.lewi.androidservicesdemo.services.aidlService"> <intent-filter> <action android:name="lewiyue.Service"/> </intent-f b2ec ilter> </service>
aidl文件
package com.lewi.aidl; interface myData{ int getPid(); String touchEvent(); }
Service类
public class aidlService extends Service { MyCommand myData; @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return myData; } @Override public void onCreate() { myData = new MyCommand(); super.onCreate(); } class MyCommand extends myData.Stub{ @Override public int getPid() throws RemoteException { // TODO Auto-generated method stub return Process.myPid(); } @Override public String touchEvent() throws RemoteException { // TODO Auto-generated method stub return null; } } }
Github源代码:Client代码, Service代码
6 Reference
http://www.android-doc.com/guide/components/aidl.html Android Interface Definition Language (AIDL)https://github.com/lewiyue/AndroidDev
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析