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

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

Java代码
  1. package com.services.demo2;
  2. //Declaretheinterface.
  3. interface IDataTimeService{
  4. StringgetCurrentDataTime();
  5. }
Java代码
  1. package com.services.demo2;
  2. //Declaretheinterface.
  3. interface IDataTimeService{
  4. StringgetCurrentDataTime();
  5. }

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

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

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

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

更多相关文章

  1. 浅析android通过jni控制service服务程序的简易流程
  2. Android四大基本组件介绍与生命周期
  3. Android(安卓)Service AIDL
  4. 第三章 Android程序设计基础
  5. Android架构分析之使用自定义硬件抽象层(HAL)模块
  6. android 定位服务
  7. 【安卓笔记】android客户端与服务端交互的三种方式
  8. android手机客户端上传文件,java servlet服务器端接收并保存到服
  9. Android(安卓)开机自启动程序

随机推荐

  1. 关于Android的文字排版和换行问题,彻底解
  2. Android(安卓)Loader的使用以及手机通讯
  3. Android Post Get 示例
  4. PopupWindow的使用
  5. 预防手机变砖头 Android刷机问题汇总
  6. From Zero to Boot: Porting Android to
  7. android调用系统邮件组件(intent匹配的流
  8. Android异常总结---W/System.err(661): j
  9. Android 拦截短信配置
  10. Android(安卓)/system 目录解析