两个进程间的Service需要进行通信,则需要把对象序列化后进行互相发送。
Android提供了一个 AIDL (Android接口定义语言)工具来处理序列化和通信。这种情况下Service需要以aidl文件的方式提供服务接口,AIDL工具将生成一个相应的java接口,并且在生成的服务接口中包含一个功能调用的stub服务桩类。Service的实现类需要去继承这个 stub服务桩类。Service的onBind方法会返回实现类的对象,之后你就可以使用它了.现在来实现一个HelloWorld级的服务以及在Activity中使用这个服务。步骤如下:

1.编写aidl文件,在这个文件中提供了服务所提供的方法的接口,文件的扩展名为aidl,在我们的示例中命名为IDataTimeService.aidl文件的内容为如下所示:

Java代码
  1. packagecom.services.demo2;
  2. //Declaretheinterface.
  3. interfaceIDataTimeService{
  4. StringgetCurrentDataTime();
  5. }
package com.services.demo2;// Declare the interface.interface IDataTimeService {String getCurrentDataTime();}

2.编写服务的实现类,在这个示例中为DataTimeService.java,内容如下:

Java代码
  1. publicclassDataTimeServiceextendsService{
  2. publicstaticfinalStringBROADCAST_ACTION="com.services.demo2.DataTimeServiceEvent";
  3. /**
  4. 使用上面定义的字符串常量创建一个Intent的实例,如果服务在运行的过程中发生的事件都可以通过Service的
  5. sendBroadcast(broadcast)方法来发送一个广播消息通知Activity,然后有Activity注册的接收者进行处理;
  6. */
  7. privateIntentbroadcast=newIntent(BROADCAST_ACTION);
  8. sendBroadcast(broadcast);
  9. privatefinalIDataTimeService.Stubbinder=newIDataTimeService.Stub(){
  10. publicStringgetCurrentDataTime(){
  11. return(getCurrentDataTimeImpl());
  12. }
  13. };
  14. synchronizedprivateStringgetCurrentDataTimeImpl(){
  15. Datedate=newDate();
  16. return(date.toLocaleString());
  17. }
  18. @Override
  19. publicIBinderonBind(Intentintent){
  20. return(binder);
  21. }
  22. }
public class DataTimeService extends Service{public static final String BROADCAST_ACTION = "com.services.demo2.DataTimeServiceEvent";/**  使用上面定义的字符串常量创建一个Intent的实例,如果服务在运行的过程中发生的事件都可以通过Service的  sendBroadcast(broadcast)方法来发送一个广播消息通知Activity,然后有Activity注册的接收者进行处理;  */private Intent broadcast = new Intent(BROADCAST_ACTION);sendBroadcast(broadcast);private final IDataTimeService.Stub binder = new IDataTimeService.Stub() {public String getCurrentDataTime() {return (getCurrentDataTimeImpl());}};synchronized private String getCurrentDataTimeImpl() {Date date=new Date();return (date.toLocaleString());}@Overridepublic IBinder onBind(Intent intent) {return (binder);}}

3.现在编写一个Activity,来消费这个服务:

Java代码
  1. publicclassServicesDemo2extendsActivity{
  2. privateIDataTimeServiceservice=null;
  3. privateIntentserviceIntent=null;
  4. privateWebViewbrowser;
  5. privateServiceConnectionsvcConn=newServiceConnection(){
  6. publicvoidonServiceConnected(ComponentNameclassName,IBinderbinder){
  7. service=IDataTimeService.Stub.asInterface(binder);
  8. browser.postDelayed(newRunnable(){
  9. publicvoidrun(){
  10. updateForecast();
  11. }
  12. },1000);
  13. }
  14. publicvoidonServiceDisconnected(ComponentNameclassName){
  15. service=null;
  16. }
  17. };
  18. @Override
  19. publicvoidonCreate(BundlesavedInstanceState){
  20. super.onCreate(savedInstanceState);
  21. setContentView(R.layout.main);
  22. browser=(WebView)findViewById(R.id.webkit);
  23. serviceIntent=newIntent(this,DataTimeServiceImpl.class);
  24. //绑定一个服务
  25. bindService(serviceIntent,svcConn,BIND_AUTO_CREATE);
  26. }
  27. @Override
  28. publicvoidonResume(){
  29. super.onResume();
  30. /**
  31. 注册广播消息的接收者,在android中服务与Activity的通信依靠广播发送消息,然后由Activity注册的接收者
  32. 接收到消息,进行相应的处理这里使用DataTimeServiceImpl.BROADCAST_ACTION来过滤,表明它只接收
  33. DataTimeService中的调用sendBroadcast(broadcast)发送的广播消息;
  34. */
  35. registerReceiver(receiver,newIntentFilter(
  36. DataTimeServiceImpl.BROADCAST_ACTION));
  37. }
  38. @Override
  39. publicvoidonPause(){
  40. super.onPause();
  41. unregisterReceiver(receiver);
  42. }
  43. @Override
  44. publicvoidonDestroy(){
  45. super.onDestroy();
  46. unbindService(svcConn);
  47. }
  48. privatevoidupdateForecast(){
  49. try{
  50. Stringpage=service.getForecastPage();
  51. if(page!=null){
  52. browser.loadDataWithBaseURL(null,page,"text/html","UTF-8",
  53. null);
  54. browser.postDelayed(newRunnable(){
  55. publicvoidrun(){
  56. updateForecast();
  57. }
  58. },1000);
  59. }
  60. }catch(finalThrowablet){
  61. svcConn.onServiceDisconnected(null);
  62. }
  63. }
  64. //接收者实例
  65. privateBroadcastReceiverreceiver=newBroadcastReceiver(){
  66. publicvoidonReceive(Contextcontext,Intentintent){
  67. runOnUiThread(newRunnable(){
  68. publicvoidrun(){
  69. updateForecast();
  70. }
  71. });
  72. }
  73. };
  74. }

更多相关文章

  1. Android中的GPS应用开发入门教程
  2. Android客户端采用Http 协议Post方式请求与服务端进行数据交互
  3. PC客户端与Android实现图片传送
  4. android Camera模块分析
  5. android上传图片至服务器
  6. Android读取服务端TXT(JSON格式数据)返回汉字乱码的问题
  7. android 窃听电话
  8. Android(安卓)绑定远程Service(此Service开启在另外一个进程中)
  9. [Android(安卓)Pro] Notification的使用

随机推荐

  1. 怎么P身份证内容教学,模糊身份证怎么P成清
  2. css基础-选择器、权重、伪类选择器
  3. ThinkPhp6.0引入JWT进行token验证
  4. 仿php中文网首页
  5. PHP分支、循环、php模板语法、html混编技
  6. 聚焦新基建发展,企业如何实现供应链再升级
  7. android 4 高级编程 第一章摘
  8. Android测试系列之一 - 测试分类(节选)
  9. Fuchsia - 简析
  10. 谷歌发布 Android(安卓)2.2:运行速度提高2