您的位置:首页 > 移动开发 > Android开发

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android Service ADIL