利用messenger跨进程通信概要

上传人:今*** 文档编号:108128496 上传时间:2019-10-22 格式:DOC 页数:12 大小:159.50KB
返回 下载 相关 举报
利用messenger跨进程通信概要_第1页
第1页 / 共12页
利用messenger跨进程通信概要_第2页
第2页 / 共12页
利用messenger跨进程通信概要_第3页
第3页 / 共12页
利用messenger跨进程通信概要_第4页
第4页 / 共12页
利用messenger跨进程通信概要_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《利用messenger跨进程通信概要》由会员分享,可在线阅读,更多相关《利用messenger跨进程通信概要(12页珍藏版)》请在金锄头文库上搜索。

1、利用Messenger跨进程通信(1)、ServiceService是android四大组件之一,是最顶层的应用容器,通常用于执行一些不用和用户交互的后台操作(播放歌曲)或者将本应用的某些功能提供给远程的客户端使用(跨进程通信),使用Service务必记住必须在AndroidManifest.xml文件中声明。启动一个Servcice的方法主要有两种,一种是startService,一种是bindService,通常来说前者是启动一个Service来执行一些后台任务,后者通常是进行远程通信使用。Service就和其他组件一样,同样依赖于宿主进程的主线程运行,所以如果我们需要做一些cpu密集型运

2、算或者其他的耗时任务,就应该给Service开启一个工作线程,否则可能会导致ANR。我们要记住的两点是:Service不是一个独立的进程,它和其他组件一样,默认情况下都是运行在当前的应用进程中(可以在AndroidManifest.xml文件单独指定进程)。:Service并不包含独立的工作线程,同样的,它也是运行在主线程中。Service主要有两大功能:告诉系统,应用希望在后台做一些工作(即使在没有和用户交互的情况下),相应的调用方法是startService,Service一旦运行就不会停止,除非显式的调用了stopService。:将本应用的一些方法暴露给远程应用,提供服务,相应的调用方

3、法是bindService,这意味着该Servcice可以与客户端进行长链接并进行交互。Service的生命周期:当启动Service的时候,onCreate方法是最先被调用的,一般来将这个时候应该初始化一些全局变量,然后onStartCommand方法会被调用。如果Service是处于运行状态的,重复调用startServcice启动Service是不会起效果的,也就是onCreate只会被调用一次,但是onStartCommand会被重复调用。一旦Service运行起来了,除非明确指出要停止它,否则它将一直运行下去,除非系统回收了它所在的进程。客户端通过调用bindService方法就可以

4、连接Service,只要这个连接还存在,Service就会运行,并且,在Service的onBind方法里面,会给客户端返回一个IBinder对象,客户端通过IBinder对象就可以获取远程服务通道,进行远程操作。拥有Service的进程的优先级:默认情况下,一个只拥有Service的进程属于服务进程,它低于可见进程和前台进程,此进程往往在成为内存不足的情况下,会成为垃圾回收机制回收的候选对象。如果想要将一个只拥有Service的服务进程优先级提高,可以通过startForeground方法将其提升为前台进程。同时,我们应该知道,Service作为一个服务对象,是被客户端所依赖的,因此它 的进

5、程的优先级必定要比客户端的高,因此,如果客户端所在进程是前台进程,那么当前进程也是前台进程。前台进程几乎不可能被回收,因为一个系统中位于前台进程的应用是很少的。通过上述介绍,可以知道,对于使用Messenger进行远程通信来说,我们必须通过BindService方法启动远程服务,同时,Service的onBind方法会返回一个可进行通信的IBinder对象,通过它就可以和远程对象进行通信。(2)、ServiceConnnectionServiceConnection是用来管理连接远程Service的状态的,ServiceConnection是bindService的第二个参数,通过实现它,就可

6、以在客户端中知道是否连接上了远程对象。ServiceConnection主要有两个方法,如下:java view plain copy print?在CODE上查看代码片派生到我的代码片public interface ServiceConnection public void onServiceConnected(ComponentName name, IBinder service); public void onServiceDisconnected(ComponentName name); :onServiceConnected:当客户端与远程Service连接上时,此方法会回调,并且

7、会获取到一个用于进行远程交流的IBinder对象Service。:onServiceDisconnected:当客户端与远程Service断开连接时回调,name表示的是远程Service的具体名称。(3)、MessageMessage是一个实现了Parcelable接口的被设计来给Handler发送消息的类,它主要有两个Int数据和一个obj数据对象,如果只是进行简单的数据传输,Message可以在我们不需要进行任何配置的情况下进行异步通信。但进行远程通信时,由于跨进程通信最终是通过Parcel来传送的,因此要求所传送的数据对象必须是Parcelable子类。具体的将在后面讲解。通常获取Me

8、ssage对象的方法是Message.obtain和handler.obtainMessage方法,这两个方法获取的Message对象是从系统的一个可循环利用的再生池里面拿出来的,这也是系统提倡的用于获取Message对象的方法。关于Message主要有以下几点:what属性:用于定义当前的Message的含义,通过它告诉接收者handler当前Message对象的作用。由于每个Handler都有各自的一块控件管理message,所以我们没必要担心Handler是否会造成冲突。:arg1、arg2属性:可供选择的且花销很小的用于存储发送给Handler的int数据。:obj属性:如果是在进程内

9、通信,那么obj是可以存储任何数据对象的。但是如果是进程间通信,obj只可以存储一些系统实现的parcelable对象,并且只能是在android 2.2之后。:replyTo属性:这个字段在进程内通信基本没用,通常他是作为客户端附加在当前Message对象的提供个服务端进行回应的。会在客户端发送给服务端的时候,一起发送过去,服务端通过获取此字段就可以给客户端回应消息。:data属性:这是个Bundle对象,可以存储任何数据。也就是说如果想传输自定义的实现了Parcelable接口的对象,就可以通过此字段来存储对象信息并发送给服务端。当获取Messege对象的时候,最好使用Message.ob

10、tain方法,这个方法有很多重载,这里就不多解释了,但是我们要知道,再使用完Message对象时,应该调用recycle方法释放Message对象,使它重新回收利用。(4)、HandlerHandler对象允许你通过MessageQueue发送和处理Message和Runnable对象,每个Handler对象都会有一个单独的线程和消息队列用于处理相关消息,Handler中进行处理Message或者Runnable对象的主要有以下六个方法:其中post系列的主要用于处理Runnable对象,send系列的用于处理Message对象,并且此方法会导致handleMessage方法的回调。对于我们了

11、解Messenger的对调来说,我们只需要知道handlerMessage方法即可,由于每个Messenger对象都会关联一个handler,因此当进程间交流的时候,有一方收到通信消息,所关联的handlerj就会回调handlerMessage方法。(5)、MessengerMessenger封装了进程间通信的基本实现,因此只要我们在一个进程里定义了Messenger对象就可以把它发送给另一个进程,让另一个进程进行处理。由于Messenger是用于进程间交流的,且它不影响应用程序的生命周期,所以如果使用Messenger进行进程间交流,请务必把它放在四大组件里面,否则一旦进程被杀死,那么Me

12、ssenger也会失去连接。Messenger也是一个实现了Parcelable接口的类,它里面包含了一个IMessenger对象,这个对象是一个典型的aidl远程对象,因此Messenger自身既可以当成一个数据对象发送给远程对象,也可以作为连接客户端和服务端的桥梁。了解Messenger对象,有以下几点要注意:Messenger的构造方法:主要有java view plain copy print?在CODE上查看代码片派生到我的代码片public Messenger(Handler target) 和java view plain copy print?在CODE上查看代码片派生到我的代

13、码片public Messenger(IBinder target) 两个,通常来说,第一种用于实例化本地进程的Messenger对象,第二种用于客户端实例化远程IBinder代理对象。除此之外,我们还需要了解两个方法:java view plain copy print?在CODE上查看代码片派生到我的代码片public void send(Message message) 此方法用于将消息对象发送给远程对象(既可以是客户端发送给服务端也可以是反过来)。java view plain copy print?在CODE上查看代码片派生到我的代码片public IBinder getBinder

14、() 此方法用于Service端将本地IBinder对象发送给客户端。(6)、Messenger通信实例接下来讲解客户端通过Messenger调用服务端的方法,并获取数据的实例。主要内容是发送User信息给服务端,并添加到服务端的list对象里面,然后获取服务端的list对象的消息返回给客户端。代码如下:首先定义一个User对象,此对象必须实现Parcelable接口,否则无法进行远程通信的传递。java view plain copy print?在CODE上查看代码片派生到我的代码片package com.example.messanger; import android.os.Parce

15、l; import android.os.Parcelable; import java.io.Serializable; /* * Created by Myy on 2016/7/15. */ public class User implements Parcelable private String name; private int age; public User(String name, int age) this.name = name; this.age = age; private User(Parcel in) name = in.readString(); age = in.readInt(); public static final Creator CREATOR = new Creator() Ove

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号