`

android进程间服务通信

阅读更多

两个进程间的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.   
  3. // Declare the interface.   
  4. interface IDataTimeService {   
  5.     String getCurrentDataTime();   
  6. }  
package com.services.demo2;

// Declare the interface.
interface IDataTimeService {
	String getCurrentDataTime();
}

 

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

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

 

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

 

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

相关推荐

    android进程间通信

    在Android系统中,进程间通信(Inter-Process Communication, 简称IPC)是一种关键机制,它允许不同应用或同一应用的不同进程之间交换数据。在Android的IPC方式中,AIDL(Android Interface Definition Language)是...

    android 进程间通信demo

    在Android系统中,进程间通信(Inter-Process Communication, 简称IPC)是一种关键机制,使得不同应用程序或同一程序的不同进程之间能够共享数据、调用服务等。本示例"android 进程间通信demo"专注于讲解如何利用...

    Android中进程之间通信的机制

    在Android开发中,进程间的通信是一项非常重要的技术。特别是当需要与不同应用程序中的Activity进行交互时,掌握正确的通信方式至关重要。本文将深入探讨如何在Android应用之间进行跨进程访问Activity,并通过具体的...

    Android进程间通信Demo

    在本"Android进程间通信Demo"中,我们将重点探讨两种主要的IPC方式:普通的进程间通信和通过AIDL(Android Interface Definition Language)实现的进程间对象传递。 首先,让我们来看看“16”部分,即Android进程间...

    Android进程间通信 源码

    在这个"Android进程间通信源码"项目中,我们有两个主要的组件:PlayerClient(客户端)和PlayerServer(服务器端)。下面将详细介绍这两个组件以及Android IPC的基础知识。 首先,我们来看`PlayerClient`。这个...

    Android 进程间通信AIDL Demo

    在Android系统中,进程间通信(IPC,Inter-Process Communication)是实现不同应用程序之间数据交换的关键技术。AIDL(Android Interface Definition Language)是Android提供的一种强大的工具,它使得跨进程调用...

    Android进程间通信AIDLDemo

    本教程将深入讲解AIDL的使用和其在Android进程间通信中的应用。 首先,我们要理解什么是AIDL。AIDL实际上是一种接口定义语言,类似于Java中的接口,但它的目的是让不同的Android进程之间能够调用彼此的方法。当一个...

    Android进程间通信(IPC)机制Binder简要介绍和学习计划

    Android进程间通信(IPC)机制Binder简要介绍和学习计划

    Android进程间通信机制(Binder)介绍

    ### Android进程间通信机制(Binder)介绍 #### 1. 概述 Android系统中,Binder机制是实现进程间通信(IPC, Inter-Process Communication)的核心技术之一。它不仅为不同进程之间的对象提供了数据交换的功能,而且还...

    android 进程间通信分析

    android 进程间通信分析 android 进程间通信分析

    Android进程间的通信AIDL实例

    虽然AIDL的学习曲线相对较陡峭,但它是Android中实现复杂进程间通信的关键技术,尤其对于跨进程服务调用和组件通信至关重要。理解并熟练掌握AIDL,能帮助开发者设计出更加高效、健壮的Android应用程序。

    android aidl 不同进程间通信

    但有时我们需要让一个应用调用另一个应用的服务或共享数据,这就需要进程间通信。Aidl便是Android为解决这一问题而提供的工具之一。 **2. Aidl简介** Aidl是一种接口定义语言,用于描述服务端公开的接口和方法。...

    Android 使用Socket完成进程间通信

    Android 使用Socket完成进程间通信,服务器段和客户端。

    Android进程间通信

    Android进程间通信文档 PDF文档

    AIDL----Android进程间通信(IPC)代码

    **Android进程间通信(IPC):AIDL详解** 在Android系统中,进程间通信(IPC,Inter-Process Communication)是应用程序之间数据交换的关键技术。AIDL(Android Interface Definition Language)是Android提供的一...

    【一图流】_02_一张图看懂 Android 进程间通信(IPC)Binder机制.png

    【一图流】_02_一张图看懂 Android 进程间通信(IPC)Binder机制:  此图表述了Android系统_进程间通信(IPC)机制全部体系,其中重点放在 Android系统中 重用 的 Binder机制 上,详尽细致,希望对大家有用;

    android进程间通信测试代码

    本示例“android进程间通信测试代码”主要探讨了一种非AIDL(Android Interface Definition Language)方式来实现进程间通信,即通过序列化对象Parcel进行数据传递。 一、Android进程间通信基础 Android系统为了...

    Android AIDL进程间通信

    2. 错误处理:由于进程间通信可能会失败,因此需要处理可能的异常情况,如远程服务未找到、连接失败等。 3. 性能考虑:进程间通信比本地方法调用开销大,因此避免不必要的跨进程通信,优化数据传输。 综上所述,...

Global site tag (gtag.js) - Google Analytics