Android远程服务与本地服务的特点以及功能差异

简介: 最近又重新看了点IPC的相关知识,以前看过不少Binder的知识,看到c++层思路就很模糊了,回头再看也算是一种学习。 IPC全称为:interprocess communication内部进程间通信,官方地址:http://developer.android.com/intl/zh-cn/guide/components/aidl.html,网上对这一块介绍的资料也着实不少,入门的话还是推荐看老罗的。

最近又重新看了点IPC的相关知识,以前看过不少Binder的知识,看到c++层思路就很模糊了,回头再看也算是一种学习。

IPC全称为:interprocess communication内部进程间通信,官方地址:http://developer.android.com/intl/zh-cn/guide/components/aidl.html,网上对这一块介绍的资料也着实不少,入门的话还是推荐看老罗的。


鉴于以前也知识看看相关知识,从来也没动手去做过,于是就照着官方文档开始动手创建Demo, 在按照官方文档实现之后,我察觉到有一个需求,官方只是说客户端可以调用远程服务端,那么远程服务端想要调用客户端可不可以呢?


为了尽快实现需求,那我就先将服务启动在本地,也就是说与Service与Activity处于同一进程,进行测试。它的结果是可行的,相关代码如下:

Activity相关代码:

<span style="font-family:Microsoft YaHei;font-size:14px;">public class MainActivity extends ActionBarActivity implements ServiceConnection, IServiceConnect {
	public final static String TAG = "MainActivity";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		...

		bindService(new Intent("com.example.aidl.RemoteService"), this, BIND_AUTO_CREATE);
	}

	@Override
	public void onServiceConnected(ComponentName name, IBinder service) {
<span style="white-space:pre">		</span>Log.e(TAG, "MainActivity onServiceConnected " + name + " - " + service);
		if (service instanceof ServiceBinder) {
			ServiceBinder new_name = (ServiceBinder) service;
			// 获取服务的引用,使服务与Activity建立双向关系
			RemoteService service2 = new_name.getService();
			service2.setmServiceConnect(this);
		}
	}

	...

	@Override
	public void callback() {
		// 这种模式只有在同一进程中的服务才可以被使用
		Log.e(TAG, "MainActivity 被服务端调用");
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		unbindService(this);
	}
}
</span>
Service相关代码:

<span style="font-family:Microsoft YaHei;font-size:14px;">public class RemoteService extends Service implements Runnable {
	public final static String TAG = "RemoteService";
	public IServiceConnect mServiceConnect;
	...

	@Override
	public IBinder onBind(Intent intent) {
		Log.i(TAG, "RemoteService onBind");
		return new ServiceBinder(this);//返回含有服务引用的内部类
	}

	public static class ServiceBinder extends Binder {
		private RemoteService service;

		public ServiceBinder(RemoteService service) {
			super();
			this.service = service;
		}

		public RemoteService getService() {
			return service;
		}
	}

	public void setmServiceConnect(IServiceConnect mServiceConnect) {
		this.mServiceConnect = mServiceConnect;
		new Handler().postDelayed(RemoteService.this, 3000);//当建立连接之后启动一个任务
	}

	@Override
	public void run() {
		if (mServiceConnect != null) {
			mServiceConnect.callback();//调用Activity的相关方法,验证通信
		}
	}

}
</span>

上述结果是可以在同一进程的Activity与Service间互相通信的,因为在onServiceConnected中回调的Binder对象则为刚刚Service返回的对象,在Activity中打印的Log如下:

那么跨进程间互相通信可不可以呢?

我们在Service的Manifest文件中给Service添加Process属性,属性值为:remote:

<span style="font-family:Microsoft YaHei;font-size:14px;"><service
            android:name="com.example.aidl.RemoteService"
            android:process=":remote" >
            <intent-filter>
                <action android:name="com.example.aidl.RemoteService" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </service></span>
好了,这下启动服务之后,它就属于远程服务了,它与Activity不属于同一个进程,在Android中一个进程则是一个虚拟机。

如果我再按照刚才的方法进行测试,服务是启动了,但是Activity收到的Binder对象却是这样的:


这里是说,返回的组件名称为RemoteService,但是返回的Binder对象则为BinderProxy,这个BinderProxy则为RemoteService远程服务在本地的代理,熟悉AIDL的相关信息的人,肯定知道Proxy知道是什么。
那么我们在这里可不可以从Proxy对象中把远程的RemoteService对象拿到呢,我们看一下调试信息:

我们看到在Proxy中的并没有RemoteService的引用,嗯,因为IPC通信,是跨进程的,我们都是通过代理与服务打交道的,所以...


那么回到标题,说说远程服务与本地服务的特点与差异:

其实都是服务,提供的功能一致,只是一个在本地,一个在其它进程,所以,服务与客户端打交道的时候就有了不同,要谨慎对待。

目录
相关文章
|
16天前
|
开发工具 Android开发 iOS开发
探索Android与iOS开发的差异与挑战
【7月更文挑战第11天】在移动应用开发的广阔天地中,Android和iOS两大平台如同双子星座般耀眼,各自拥有独特的开发生态和用户群体。本文将深入分析这两个平台的显著差异,从技术架构到开发工具,再到市场定位,揭示它们之间的异同。通过比较,我们不仅能够更好地理解各自的优势和局限,还能洞察未来移动应用开发的趋势。
|
5天前
|
IDE 开发工具 Android开发
安卓与iOS开发环境的差异性分析
在移动应用开发的广阔舞台上,安卓和iOS两大操作系统各据一方,引领着市场潮流。它们各自拥有独特的开发环境和工具集,为开发者提供了不同的挑战与机遇。本文旨在深入剖析这两个平台的开发环境,通过比较它们的编程语言、集成开发环境(IDE)、用户界面设计、以及系统架构等方面,揭示各自的优势与局限。我们将探讨如何基于这些差异来优化开发策略,并预测未来可能的发展趋势,以期为开发者在选择平台时提供有价值的参考。
|
4天前
|
前端开发 Android开发 iOS开发
探索安卓与iOS开发的差异性与互补性
在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统各据一方,引领着市场潮流。它们在技术架构、开发环境及用户群体等方面展现出独特的差异性,同时也存在着潜在的互补性。本文将深入剖析这两种平台的开发细节,从不同角度揭示其各自优势及相互之间的协同潜力,为开发者提供全面而深刻的视角。
10 2
|
4天前
|
IDE Android开发 Swift
探究iOS与安卓应用开发的核心差异
在数字时代,移动应用开发已成为技术革新的主战场。本文将通过对比分析iOS和安卓两大平台,深入探讨它们在开发环境、编程语言、用户界面设计、系统架构以及市场分布等方面的根本差异。我们将利用最新的行业报告和案例研究,结合统计数据,提供一个全面而深入的视角来理解这两个操作系统对开发者和技术选择的影响。
11 2
|
4天前
|
开发工具 Android开发 iOS开发
探索Android与iOS开发环境的差异性
在移动应用开发的广阔天地中,Android和iOS两大平台如同双子星座般耀眼。本文将深入探讨这两个操作系统的开发环境,揭示它们在编程语言、工具、用户界面设计以及性能优化等方面的显著差异。通过对比分析,旨在为开发者提供清晰的平台选择指导,并帮助他们理解各自环境下的最佳实践。
|
5天前
|
IDE API Android开发
安卓与iOS开发环境的差异及适配策略
在移动应用开发的广阔舞台上,Android和iOS两大操作系统各据一方,各自拥有独特的开发环境和工具集。本文旨在深入探讨这两个平台在开发环境上的关键差异,并提供有效的适配策略,帮助开发者优化跨平台开发流程。通过比较Android的Java/Kotlin和iOS的Swift/Objective-C语言特性、IDE的选择、以及API和系统服务的访问方式,本文揭示了两个操作系统在开发实践中的主要分歧点,并提出了一套实用的适配方法,以期为移动开发者提供指导和启示。
|
10天前
|
Java Android开发 iOS开发
探索安卓与iOS开发的差异性与互操作性
【7月更文挑战第17天】在移动应用开发的广阔天地中,安卓和iOS这两大操作系统如同双子星座般璀璨夺目。它们各自拥有独特的开发环境、编程语言和用户群体,为开发者提供了不同的挑战和机遇。本文将从多个维度深入剖析安卓与iOS开发的差异性,并探讨它们之间的互操作性如何实现,以期为开发者们提供一份实用的指南。
24 7
|
8天前
|
Java Android开发 Swift
探索iOS与安卓开发的差异与挑战
本文深入探讨了iOS和安卓两大移动操作系统在应用开发领域的不同点及其所面临的挑战。通过对开发环境、编程语言、用户界面设计、性能优化及市场策略的比较分析,揭示了各自平台的独特性以及开发者需要克服的技术与市场障碍。 【7月更文挑战第19天】
|
8天前
|
Java Android开发 iOS开发
探索安卓与iOS开发的差异:平台特性与用户体验的对比分析
【7月更文挑战第19天】在移动开发的广阔天地中,安卓与iOS两大阵营各据一方,它们在开发环境、用户界面设计、性能优化等方面展现出独特的魅力与挑战。本文旨在深入探讨这两个平台在技术开发和用户体验上的根本差异,并分析这些差异如何影响开发者的策略和最终用户的选择。通过比较两者的编程语言、工具、框架以及设计理念,我们将揭示各自平台的优势与局限,为开发者提供实用的参考,并为消费者呈现一个更加清晰的平台选择视角。
|
9天前
|
人工智能 Android开发 iOS开发
探索iOS与安卓应用开发的核心差异及未来趋势
在移动操作系统的竞争中,iOS和安卓各自展现出独特的魅力。本文将深入分析这两大平台在应用开发上的主要差异,并探讨它们面临的挑战及未来的发展方向。通过对比两者的开发环境、用户体验设计、市场分布和商业模式,我们旨在为开发者提供一个清晰的指导,帮助他们在不断变化的技术景观中作出明智的选择。 【7月更文挑战第18天】
18 2