简单的android进程间(远程)服务通信示例【AIDL方式】
2013-04-10 12:48
691 查看
背景:两个进程间的Service需要进行通信,则需要把对象序列化后进行互相发送。
Android提供了一个 AIDL (Android接口定义语言)工具来处理序列化和通信。这种情况下Service需要以aidl文件的方式提供服务接口,AIDL工具将生成一个相应的java接口,并且在生成的服务接口中包含一个功能调用的stub服务桩类。Service的实现类需要去继承这个 stub服务桩类。Service的onBind方法会返回实现类的对象,之后你就可以使用它了.现在来实现一个HelloWorld级的服务以及在Activity中使用这个服务。步骤如下:
值得注意的是:其中不能加修饰符(private、public等)、AIDL不支持的数据类型(如InputStream和OutputStream)等内容。在清单文件中还需要配置AIDL服务,<action>标签中android:name的属性值就是客户端要引用该服务的ID,也就是Intent类的参数值。
在清单文件中配置MyService类,代码如下:
如图所示:
Android提供了一个 AIDL (Android接口定义语言)工具来处理序列化和通信。这种情况下Service需要以aidl文件的方式提供服务接口,AIDL工具将生成一个相应的java接口,并且在生成的服务接口中包含一个功能调用的stub服务桩类。Service的实现类需要去继承这个 stub服务桩类。Service的onBind方法会返回实现类的对象,之后你就可以使用它了.现在来实现一个HelloWorld级的服务以及在Activity中使用这个服务。步骤如下:
1.编写aidl文件
在这个文件中提供了服务所提供的方法的接口,文件的扩展名为aidl,在我们的示例中命名为IDataTimeService.aidl文件的内容为如下所示:值得注意的是:其中不能加修饰符(private、public等)、AIDL不支持的数据类型(如InputStream和OutputStream)等内容。在清单文件中还需要配置AIDL服务,<action>标签中android:name的属性值就是客户端要引用该服务的ID,也就是Intent类的参数值。
package net.blogjava.mobile.aidl; interface IMyService { String getValue(); }
2.编写服务的实现类
在这个示例中为MyService.java,内容如下:public class MyService extends Service { public class MyServiceImpl extends IMyService.Stub { @Override public String getValue() throws RemoteException { // TODO Auto-generated method stub return "Android/OPhone开发讲义"; } } @Override public IBinder onBind(Intent intent) { return new MyServiceImpl(); } }
在清单文件中配置MyService类,代码如下:
<service android:name=".MyService"> <intent-filter> <action android:name="net.blogjava.mobile.aidl.IService"/> </intent-filter> </service>其中net.blogjava.mobile.aidl.IService是客户端访问AIDL服务的ID。
3.现在编写一个客户端Activity,来消费这个服务:
新建一个工程,并将自动生成的IMyService.java文件连同包目录一起复制到本工程下的src目录中如图所示:
public class Main extends Activity implements OnClickListener { private IMyService myService = null; private Button btnInvokeAIDLService; private Button btnBindAIDLService; private TextView textView; private ServiceConnection serviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { myService = IMyService.Stub.asInterface(service); btnInvokeAIDLService.setEnabled(true); } @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub } }; @Override public void onClick(View view) { switch (view.getId()) { case R.id.btnBindAIDLService: bindService(new Intent("net.blogjava.mobile.aidl.IMyService"), serviceConnection, Context.BIND_AUTO_CREATE); break; case R.id.btnInvokeAIDLService: try { textView.setText(myService.getValue()); } catch (Exception e) { } break; } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnInvokeAIDLService = (Button) findViewById(R.id.btnInvokeAIDLService); btnBindAIDLService = (Button) findViewById(R.id.btnBindAIDLService); btnInvokeAIDLService.setEnabled(false); textView = (TextView) findViewById(R.id.textview); btnInvokeAIDLService.setOnClickListener(this); btnBindAIDLService.setOnClickListener(this); } }
相关文章推荐
- Android开发之使用AIDL和远程服务实现进程通信
- 使用AIDL和远程服务实现进程通信
- 通过AIDL和远程服务进行进程中的通信
- 使用AIDL和远程服务实现进程通信
- 使用AIDL和远程服务实现进程通信
- 第二篇:Android 学习之AIDL学习 :远程服务的绑定和通信
- 使用AIDL和远程服务实现进程通信
- Android学习笔记_23_服务Service之AIDL和远程服务实现进程通信以及进程间传递自定义类型参数
- Android Service AIDL 远程调用服务之简单音乐播放实例【转载】
- 使用AIDL和远程服务实现进程通信
- 使用AIDL和远程服务实现进程通信
- Android多进程间采用AIDL方式进行通信
- 使用AIDL和远程服务实现进程通信(转)
- android进程间服务通信示例
- 使用AIDL实现IPC通信之——简单调用远程服务的方法
- Android开发之通过AIDL服务实现进程间的通信
- 使用AIDL和远程服务实现进程通信
- android进程间的通信方式AIDL
- 进程间的通信AIDL与远程服务的访问
- android 进程间服务通信示例