`
yangwei0915
  • 浏览: 465221 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

android进程间服务通信示例

阅读更多

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

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

package com.services.demo2;

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

 

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

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,来消费这个服务:

 

public class ServicesDemo2 extends Activity {
	private IDataTimeService service = null;
	private Intent serviceIntent = null;
	private WebView browser;
	private ServiceConnection svcConn = new ServiceConnection() {
		public void onServiceConnected(ComponentName className, IBinder binder) {
			service = IDataTimeService.Stub.asInterface(binder);

			browser.postDelayed(new Runnable() {
				public void run() {
					updateForecast();
				}
			}, 1000);
		}

		public void onServiceDisconnected(ComponentName className) {
			service = null;
		}
	};

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		browser = (WebView) findViewById(R.id.webkit);
		serviceIntent = new Intent(this, DataTimeServiceImpl.class);
		//绑定一个服务
		bindService(serviceIntent, svcConn, BIND_AUTO_CREATE);
	}

	@Override
	public void onResume() {
		super.onResume();
		/**		  
		  注册广播消息的接收者,在android中服务与Activity的通信依靠广播发送消息,然后由Activity注册的接收者
		  接收到消息,进行相应的处理这里使用DataTimeServiceImpl.BROADCAST_ACTION来过滤,表明它只接收
		  DataTimeService中的调用sendBroadcast(broadcast)发送的广播消息;
		  */
		registerReceiver(receiver, new IntentFilter(
				DataTimeServiceImpl.BROADCAST_ACTION));
	}

	@Override
	public void onPause() {
		super.onPause();
		unregisterReceiver(receiver);
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
		unbindService(svcConn);
	}	
	
	private void updateForecast() {
		try {
			String page = service.getForecastPage();			
			if (page != null) {
				browser.loadDataWithBaseURL(null, page, "text/html", "UTF-8",
						null);
				browser.postDelayed(new Runnable() {
					public void run() {
						updateForecast();
					}
				}, 1000);
			}
		} catch (final Throwable t) {
			svcConn.onServiceDisconnected(null);
		}
	}

	//接收者实例
	private BroadcastReceiver receiver = new BroadcastReceiver() {
		public void onReceive(Context context, Intent intent) {
			runOnUiThread(new Runnable() {
				public void run() {
					updateForecast();
				}
			});
		}
	};
}

 

分享到:
评论

相关推荐

    android进程间通信

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

    android 进程间通信demo

    本示例"android 进程间通信demo"专注于讲解如何利用Android Interface Definition Language (AIDL) 实现这一功能。 AIDL是Android提供的一个接口定义工具,它允许我们定义服务间的接口,这样不同的进程可以通过 ...

    Android中进程之间通信的机制

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

    Android进程间通信Demo

    总结来说,这个"Android进程间通信Demo"涵盖了Android IPC的基础和高级技巧,通过分析和实践这些示例,开发者能够更好地理解和运用Android系统提供的各种通信机制,提升应用程序的性能和用户体验。

    Android进程间通信AIDLDemo

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

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

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

    android aidl 不同进程间通信

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

    android进程间通信测试代码

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

    android进程间通信之AIDL

    android进程间通信之AIDL的简单的示例代码

    android 与 PC socket 通信示例测试过

    Socket基于TCP/IP协议,提供了进程间通信(IPC,Inter-Process Communication)的能力,允许两个网络应用程序之间进行双向通信。在Android与PC之间使用Socket通信时,Android设备作为客户端(Client),而PC则作为...

    Android-Android进程间通信之AIDL

    **Android进程间通信之AIDL详解** Android系统作为一个多任务操作系统,多个应用程序之间可能存在需要相互交互的需求,这就涉及到了进程间通信(IPC, Inter-Process Communication)。在Android中,AIDL(Android ...

    Android 进程间通信

    在提供的资源中,"分层图.jpg"可能展示了Android系统中的进程间通信层次结构,而"AIDLSample"可能是一个包含AIDL使用示例的项目,你可以参考这些资源来进一步理解AIDL的实践应用。通过深入理解和熟练运用AIDL,...

    Android使用AIDL实现进程间通信

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

    Android AIDL进程间通信例子代码

    在Android系统中,进程间通信(Inter-Process Communication, 简称IPC)是一种关键的技术,使得不同进程...通过理解并实践`AndroidAIDLClient`和`AndroidAIDL`这两个示例,你可以更深入地掌握Android的进程间通信技术。

    Android进程间通信-Binder机制

    ### Android进程间通信——Binder机制 #### 一、简要介绍和学习计划 在Android操作系统中,每一个应用程序通常由多个组件如Activity和服务(Service)组成。这些组件可能运行在同一进程中,也可能分布在不同进程中。...

    android aidl跨进程通信

    标题“android aidl跨进程通信”指的是通过AIDL在Android上进行不同进程间的数据交换和功能调用的过程。在Android中,每个应用默认运行在自己的进程中,当需要不同应用间共享数据或调用对方的功能时,就需要借助IPC...

    android 本地服务通信 AIDL service服务与activity之间的通信

    AIDL(Android Interface Definition Language)是Android系统提供的一种接口定义语言,用于处理Android应用组件间的进程间通信(IPC,Inter-Process Communication),特别是Activity和服务之间的通信。本示例...

    Android中线程间通信.pdf

    ### Android中线程间通信详解 #### 一、引言 在Android开发中,线程间的通信是一项重要的技术。为了确保应用的响应性和流畅性,开发者必须了解如何正确地管理和同步多个线程之间的数据交换。本文将深入探讨Android...

    Android进程间通信实践的示例代码

    本文介绍了Android进程间通信实践的示例代码,分享给大家,具体如下: 因为线程间的内存是共享的,所以它们之间的通信简单,比如可以通过共享变量等方式实现。而进程间想要通信就要麻烦许多了。要想实现进程间通信...

Global site tag (gtag.js) - Google Analytics