aidl
2015-11-18 09:50
369 查看
Android支持两种类型的服务:本地服务与远程服务。本地服务只能供承载它的应用程序使用,而远程服务还可以供其它应用程序使用。在Android中,远程服务可以使用AIDL(Android Interface Definition Language)向客户端定义自身。
下面说明创建AIDL服务的步骤:
编写一个AIDL文件(以.aidl为后缀)来向客户端定义接口,AIDL文件使用java语法。
将此AIDL文件添加到eclipse项目的src目录下。ADT将会调用AIDL编译器自动生成一个java接口,此文件位于gen目录下,可以打开查看。
实现一个服务并从onBind()方法中返回生成的接口(一般我们在服务中实现这个接口,然后在onBind()方法中返回其实例)。
在Manifest中配置Service,这里我们必须要使用intent-filter,并为其添加action属性。
废话不说,上代码(很简单的代码):
项目结构
Person.aidl(注意:接口不能有修饰符)
[java] view
plaincopy
package kevin.demo;
interface Person {
int getAge(String name);
}<strong>
</strong>
RemoteServcie
[java] view
plaincopy
package kevin.demo;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
public class RemoteService extends Service {
public static final String REMOTE_SERVICE_ACTION = "kevin.demo.action.remote";
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
System.out.println("service created..");
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
System.out.println("Service bound..");
// 返回远程服务的实例
return new PersonIml();
}
@Override
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
System.out.println("service unbound");
return super.onUnbind(intent);
}
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
System.out.println("Service started..");
}
// 远程服务的实现
private class PersonIml extends Person.Stub {
@Override
public int getAge(String name) throws RemoteException {
if (name.equals("kevin")) {
return 22;
}
return -1;
}
}
}<strong>
</strong>
Android Manifest
[html] view
plaincopy
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="kevin.demo" android:versionCode="1" android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<service android:name="RemoteService">
<intent-filter>
<action android:name="kevin.demo.action.remote"></action>
</intent-filter>
</service>
</application>
</manifest>
接下来我们实现客户端的项目,通过此项目我们可以访问刚才定义的远程服务。这里我们必须把在远程服务项目中定义 的AIDL接口复制到此项目中,并且要保证包名与远程项目中此接口文件所在包名相同,并且此包中的Activity不能和此文件同包。下面是项目结构与代码:
Person.aidl同上
RemoteClient.java
[java] view
plaincopy
[java] view
plaincopy
package kevin.client;
import kevin.demo.Person;
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.widget.Toast;
public class RemoteClient extends Activity {
/** Called when the activity is first created. */
private static final String TAG = "RemoteClient";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
System.out.println(TAG + " onStart..");
bindService(new Intent("kevin.demo.action.remote"), conn,
BIND_AUTO_CREATE);
System.out.println(TAG + "bindService invoked..");
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
unbindService(conn);
}
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
System.out.println("RemoteClient service disconnected..");
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
System.out.println("RemoteClient servcie connected..");
System.out.println("-------------------");
Person remoteServ = Person.Stub.asInterface(service);
try {
System.out.println("My age is: " + remoteServ.getAge("kevin"));
Toast.makeText(RemoteClient.this,
"My age is: " + remoteServ.getAge("kevin"),
Toast.LENGTH_LONG).show();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("-------------------");
}
};
}
下面说明创建AIDL服务的步骤:
编写一个AIDL文件(以.aidl为后缀)来向客户端定义接口,AIDL文件使用java语法。
将此AIDL文件添加到eclipse项目的src目录下。ADT将会调用AIDL编译器自动生成一个java接口,此文件位于gen目录下,可以打开查看。
实现一个服务并从onBind()方法中返回生成的接口(一般我们在服务中实现这个接口,然后在onBind()方法中返回其实例)。
在Manifest中配置Service,这里我们必须要使用intent-filter,并为其添加action属性。
废话不说,上代码(很简单的代码):
项目结构
Person.aidl(注意:接口不能有修饰符)
[java] view
plaincopy
package kevin.demo;
interface Person {
int getAge(String name);
}<strong>
</strong>
RemoteServcie
[java] view
plaincopy
package kevin.demo;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
public class RemoteService extends Service {
public static final String REMOTE_SERVICE_ACTION = "kevin.demo.action.remote";
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
System.out.println("service created..");
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
System.out.println("Service bound..");
// 返回远程服务的实例
return new PersonIml();
}
@Override
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
System.out.println("service unbound");
return super.onUnbind(intent);
}
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
System.out.println("Service started..");
}
// 远程服务的实现
private class PersonIml extends Person.Stub {
@Override
public int getAge(String name) throws RemoteException {
if (name.equals("kevin")) {
return 22;
}
return -1;
}
}
}<strong>
</strong>
Android Manifest
[html] view
plaincopy
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="kevin.demo" android:versionCode="1" android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<service android:name="RemoteService">
<intent-filter>
<action android:name="kevin.demo.action.remote"></action>
</intent-filter>
</service>
</application>
</manifest>
接下来我们实现客户端的项目,通过此项目我们可以访问刚才定义的远程服务。这里我们必须把在远程服务项目中定义 的AIDL接口复制到此项目中,并且要保证包名与远程项目中此接口文件所在包名相同,并且此包中的Activity不能和此文件同包。下面是项目结构与代码:
Person.aidl同上
RemoteClient.java
[java] view
plaincopy
[java] view
plaincopy
package kevin.client;
import kevin.demo.Person;
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.widget.Toast;
public class RemoteClient extends Activity {
/** Called when the activity is first created. */
private static final String TAG = "RemoteClient";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
System.out.println(TAG + " onStart..");
bindService(new Intent("kevin.demo.action.remote"), conn,
BIND_AUTO_CREATE);
System.out.println(TAG + "bindService invoked..");
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
unbindService(conn);
}
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
System.out.println("RemoteClient service disconnected..");
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
System.out.println("RemoteClient servcie connected..");
System.out.println("-------------------");
Person remoteServ = Person.Stub.asInterface(service);
try {
System.out.println("My age is: " + remoteServ.getAge("kevin"));
Toast.makeText(RemoteClient.this,
"My age is: " + remoteServ.getAge("kevin"),
Toast.LENGTH_LONG).show();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("-------------------");
}
};
}
相关文章推荐
- 运行yum报错Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again
- 关于安装APK到Genymation 模拟器报 install failed cpu abi incompatible
- Kafka设计解析(三)- Kafka High Availability (下)
- aircrack-ng破解wifi密码基础教程
- Rails practise
- Rails First Blood
- Rails startup
- Rails migration
- Rails Kinds
- 两种智能指针-RAII智能指针和引用计数智能指针
- AVL树笔记(二):maintain,delete
- (转)RabbitMQ消息队列(一): Detailed Introduction 详细介绍
- Once you eliminate all the other factors,the only thing remaining must be the truth.
- fail-fast机制
- Kafka设计解析(二)- Kafka High Availability (上)
- 关于int main(int argc,char*argv[])的玩意
- hdu 2389 Rain on your Parade 二分图匹配+HK算法
- Adb failed to restart! Make sure the plugin is properly configured.
- 关于container_of和list_for_each_entry 及其相关函数的分析
- OC中retain和assign的setter方法的写法和区别