用于安卓系统的消息传递方法及计算机可读存储介质与流程

文档序号:24069661发布日期:2021-02-26 14:30阅读:84来源:国知局
[0001]本发明涉及通信
技术领域
:,尤其涉及一种用于安卓系统的消息传递方法及计算机可读存储介质。
背景技术
::[0002]对于安卓(android)系统来说,消息传递是最基本的组件,每个应用内的不同页面、不同组件都在进行消息传递。消息传递既可以用于android四大组件之间的传递,也可以用于异步线程与主线程之间的通信,但是目前的消息传递方式存在内存泄露的风险,进而可能导致应用崩溃。技术实现要素:[0003]本发明旨在至少在一定程度上解决相关技术中的技术问题之一。为此,本发明的第一个目的在于提出一种用于安卓系统的消息传递方法,该方法不仅能够有效减少内存泄露的风险,而且能够实现跨进程通信。[0004]本发明的第二个目的在于一种计算机可读存储介质。[0005]为达到上述目的,本发明第一方面实施例提出一种用于安卓系统的消息传递方法,包括以下步骤:在接收到消息发送请求后,判断是否为进程内发送消息;若为进程内发送消息,则根据消息设置可观察存储器类的值,以便消息的订阅者基于可观察存储器类进行消息回调以获得消息;若为跨进程发送消息,则确定广播意图,并通过广播方式将广播意图传递给订阅者,以便订阅者根据广播意图获取消息,广播意图包括消息和订阅者的标识信息。[0006]根据本发明实施例的用于安卓系统的消息传递方法,在接收到消息发送请求后,判断是否为进程内发送消息,若为进程内发送消息,则根据消息设置可观察存储器类的值,以便消息的订阅者基于可观察存储器类进行消息回调以获得消息,由于可观察存储器类具备生命周期感知,因而通过可观察存储器类进行消息传递,能够有效减少内存泄露的风险;若为跨进程发送消息,则确定广播意图,并通过广播方式将广播意图传递给订阅者,以便订阅者根据广播意图获取消息,由此实现跨进程通信。[0007]根据本发明的一个实施例,在根据消息设置可观察存储器类的值或者确定广播意图之前,还包括:判断当前所处线程是否为主线程;若为主线程,则根据消息设置可观察存储器类的值或者确定广播意图;若为非主线程,则在通过handler将当前所处线程切换至主线程后,根据消息设置可观察存储器类的值或者确定广播意图。[0008]根据本发明的一个实施例,在根据消息设置可观察存储器类的值或者确定广播意图之前,还包括:通过handler设置消息的延迟发送时间。[0009]根据本发明的一个实施例,在根据消息设置可观察存储器类的值或者确定广播意图之前,还包括:通过handler设置消息的消息等级,消息等级用于表征消息的发送顺序。[0010]根据本发明的一个实施例,在接收到消息发送请求后,还包括:对消息进行类型转换;将转换后的消息写入跨进程消息载体;将跨进程消息载体加入至待发送消息列表。[0011]根据本发明的一个实施例,在根据所述消息设置可观察存储器类的值之后,还包括:通过可观察存储器类观察订阅者的生命周期;若订阅者的生命周期结束,则将消息从消息列表中清除。[0012]根据本发明的一个实施例,生命周期结束包括:订阅者被取消,或者订阅者的activity和/或fragment的生命周期被销毁。[0013]根据本发明的一个实施例,通过广播方式将广播意图传递给订阅者,包括:通过广播方式将广播意图传递给订阅者对应的广播接收器,以通过广播接收器接收广播意图,并根据广播意图获取消息,以及通过可观察存储器类将消息传递给订阅者。[0014]根据本发明的一个实施例,可观察存储器类为livedata类。[0015]为达到上述目的,本发明第二方面实施例提出一种计算机可读存储介质,其上存储有用于安卓系统的消息传递程序,该消息传递程序被处理器执行时实现上述的用于安卓系统的消息传递方法。[0016]根据本发明实施例的计算机可读存储介质,通过上述的用于安卓系统的消息传递方法,不仅能够有效减少内存泄露的风险,而且能够实现跨进程通信。[0017]本发明附加的方面和优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明的实践了解到。附图说明[0018]图1为根据本发明一个实施例的用于安卓系统的消息传递方法的流程图;[0019]图2为根据本发明一个具体示例的用于安卓系统的消息传递方法的流程图。具体实施方式[0020]下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,旨在用于解释本发明,而不能理解为对本发明的限制。[0021]下面参考附图描述本发明实施例提出的用于安卓系统的消息传递方法及计算机可读存储介质。[0022]图1为根据本发明一个实施例的用于安卓系统的消息传递方法的流程图。参考图1所示,该用于安卓系统的消息传递方法可包括以下步骤:[0023]步骤s101,在接收到消息发送请求后,判断是否为进程内发送消息。[0024]消息可以是任何的对象(object),可以定义不同类型的消息,也可以是自定义的消息。消息的发送包括进程内发送消息和跨进程发送消息(也可称进程间发送消息)。在接收到消息发送请求后,可根据消息发送请求判断是进程内发送消息还是跨进程发送消息,具体可采用现有技术实现,这里不做限制。[0025]在一个实施例中,在接收到消息发送请求后,还包括:对消息进行类型转换;将转换后的消息写入跨进程消息载体;将跨进程消息载体加入至待发送消息列表。其中,转换后的数据类型包括但不限于是boolean类型、double类型、float类型、int类型、long类型、string类型和自定义类型。[0026]具体地,在接收到消息发送请求后,消息发布者可先对消息进行类型转换,如转换为boolean类型、double类型或者float类型等,然后将转换后的消息写入至跨进程消息载体如bundle(一种安卓跨进程通信消息载体),并创建和保存消息的数据结构如hashmap(哈希散列表),以及保存跨进程消息载体至hashmap。也就是说,消息发布者将所有待发送消息先分别写入至相应的跨进程消息载体中,然后将跨进程消息载体保存至待发送消息列表中,以便后续对待发送消息列表中的消息进行逐一传递。[0027]需要说明的是,在保存跨进程消息载体至hashmap之前,还判断该跨进程消息载体中的消息在hashmap中是否已经存在,如果存在,则不保存,否则,将该跨进程消息载体保存至hashmap。也就是说,在保存前,先检查待发送消息是否已经存在待发送消息列表中,如果存在,则不保存,以减少保存次数。[0028]步骤s102,若为进程内发送消息,则根据消息设置可观察存储器类的值,以便消息的订阅者基于可观察存储器类进行消息回调以获得消息。可选的,可观察存储器类为livedata类。[0029]在接收到消息发送请求后,消息发布者可先将消息通过跨进程消息载体存储至待发送消息列表中,然后根据消息发送请求判断是为进程内发送消息还是跨进程发送消息。若为进程内发送消息,则通过可观察存储器类将消息传递给消息的订阅者,例如,可观察存储器类为livedata类,消息总线中具有多个livedata类,每个livedata类代表一个消息通道,且每个livedata类具有相应的标识信息和订阅者列表,在进行消息发送时,先通过getchannel获取消息通道,即获取livedata类,然后设置livedata类的值以告知订阅者列表中所有订阅者当前数据有更新,对应的程序代码可以是:livedata<hashmap>.set(newhashmap),此时订阅者列表中的所有订阅者可通过消息回调方法获取消息,例如通过继承livedata类中的mutablelivedata,重写observe方法,并将回调方法添加至订阅者列表中。[0030]需要说明的是,订阅者在通过消息回调方法获取消息之前,还判断当前所处线程是否为主线程,若为非主线程,则通过handler将当前所处线程切换至主线程,然后定义消息回调方法,通过继承livedata类中的mutablelivedata,重写observe方法,将回调方法添加至订阅者列表中,以获取消息。[0031]在一个实施例中,在根据所述消息设置可观察存储器类的值之后,还包括:通过可观察存储器类观察订阅者的生命周期;若订阅者的生命周期结束,则将消息从消息列表中清除。可选的,生命周期结束包括:订阅者被取消,或者订阅者的activity和/或fragment的生命周期被销毁。[0032]具体地,可通过lifecycleowner接口获取对应的订阅者,并定义lifecyclelivedata继承livedata类,重写livedata类中的removeobserver方法,在该方法中,如果消息订阅者已经取消、或者订阅者的activity的生命周期被销毁、或者订阅者的fragment生命周期被销毁等,则将保存在待发送消息列表如hashmap中的消息删除,避免了内存泄漏。[0033]在一个实施例中,在根据消息设置可观察存储器类的值之前,还包括:判断当前所处线程是否为主线程;若为主线程,则根据消息设置可观察存储器类的值;若为非主线程,则在通过handler将当前所处线程切换至主线程后,根据消息设置可观察存储器类的值。[0034]也就是说,在确定当前为进程内发送消息时,消息发布者先判断当前所处线程是否为主线程,若为主线程,则根据消息设置可观察存储器类如livedata类的值,以通过可观察存储器类如livedata类进行消息的传递;否则,先通过handler将当前所处线程切换至主线程,然后再根据消息设置可观察存储器类如livedata类,以通过可观察存储器类如livedata类进行消息的传递。[0035]在一个实施例中,在根据消息设置可观察存储器类的值之前,还包括:通过handler设置消息的延迟发送时间。即,在进程内发送延迟消息时,可通过handler来设置需要延迟发送的时间,然后再根据消息设置可观察存储器类如livedata类,以通过可观察存储器类如livedata类进行消息的传递,从而实现进程内消息的延迟发送,有效解决了消息无法延迟发送的问题。[0036]在一个实施例中,在根据消息设置可观察存储器类的值之前,还包括:通过handler设置消息的消息等级,消息等级用于表征消息的发送顺序。即,在进程内有序发送消息时,可通过handler来设置消息的消息等级即优先级,然后根据消息等级逐一发送消息,并在消息发送时,根据消息设置可观察存储器类如livedata类,以通过可观察存储器类如livedata类进行消息的传递,从而实现进程内消息的有序发送,有效解决了消息无法有序发送的问题。[0037]作为一种示例,在确定当前为进程内发送消息时,可先通过handler设置消息发送的延迟时间以及消息的消息等级,以便按照延迟时间和消息等级对待发送消息列表中的消息进行逐一发送。在发送时,判断当前所处线程是否为主线程,若为主线程,则根据消息设置可观察存储器类如livedata类;否则,先通过handler将当前所处线程切换至主线程,然后根据消息设置可观察存储器类如livedata类。在可观察存储器类如livedata类的值发生改变时,可观察存储器类如livedata类会将其告知相应的订阅者列表中的所有订阅者,此时订阅者先判断当前所处线程是否为主线程,若为非主线程,则先通过handler将当前所处线程切换至主线程,然后定义消息回调方法,通过继承可观察存储器类如livedata类中的mutablelivedata,重写observe方法,将回调方法添加至订阅者列表中,以获取消息。[0038]在上述实施例中,由于可观察存储器类如livedata类可以感知并遵循activity、fragment等组件的生命周期,当组件被销毁时,立即清空待发送消息列表中的数据,避免内存泄露,同时基于handler能够实现消息的延迟发送和有序发送,解决了消息无法延迟发送和有序发送的问题。[0039]步骤s103,若为跨进程发送消息,则确定广播意图,并通过广播方式将广播意图传递给订阅者,以便订阅者根据广播意图获取消息,广播意图包括消息和订阅者的标识信息。[0040]若为跨进程发送消息,则通过广播方式将消息传递给消息的订阅者,例如,先确定广播意图,该广播意图包括消息和订阅者的标识信息,然后通过broadcast将广播意图传递给订阅者,此时订阅者根据广播意图获取消息。[0041]根据本发明的一个实施例,通过广播方式将广播意图传递给订阅者,包括:通过广播方式将广播意图传递给订阅者对应的广播接收器,以通过广播接收器接收广播意图,并根据广播意图获取消息,以及通过可观察存储器类将消息传递给订阅者。[0042]具体地,在跨进程发送消息时,可先注册和定义广播接收器,例如定义广播接收器类,继承broadcastreceiver即订阅者,通过广播接收器接收广播意图,并在接收到广播意图后,获取广播意图中的消息,并对消息进行类型转换,以使其符合订阅者对应的数据类型,如前述类型,然后通过可观察存储器类将消息传递给进程内的订阅者。也就是说,在跨进程发送消息时,先通过广播方式将消息传递给订阅者对应的广播接收器,然后由广播接收器获取消息,并通过可观察存储器类将消息传递给进程内订阅者。[0043]在一个实施例中,在确定广播意图之前,还包括:判断当前所处线程是否为主线程;若为主线程,则确定广播意图;若为非主线程,则在通过handler将当前所处线程切换至主线程后,确定广播意图。[0044]也就是说,在确定当前为跨进程发送消息时,消息发布者先判断当前所处线程是否为主线程,若为主线程,则确定广播意图,并通过广播方式将广播意图传递给订阅者,以便订阅者根据广播意图获取消息;否则,先通过handler将当前所处线程切换至主线程,然后再确定广播意图,并通过广播方式将广播意图传递给订阅者,以便订阅者根据广播意图获取消息。[0045]在一个实施例中,在确定广播意图之前,还包括:通过handler设置消息的延迟发送时间。即,在跨进程发送延迟消息时,可通过handler来设置需要延迟发送的时间,然后再确定广播意图,并通过广播方式将广播意图传递给订阅者,以便订阅者根据广播意图获取消息,从而实现跨进程消息的延迟发送,有效解决了消息无法延迟发送的问题。[0046]在一个实施例中,在确定广播意图之前,还包括:通过handler设置消息的消息等级,消息等级用于表征消息的发送顺序。即,在跨进程有序发送消息时,可通过handler来设置消息的消息等级即优先级,然后根据消息等级逐一发送消息,并在消息发送时,确定广播意图,并通过广播方式将广播意图传递给订阅者,以便订阅者根据广播意图获取消息,从而实现跨进程消息的有序发送,有效解决了消息无法有序发送的问题。[0047]作为一种示例,在确定当前为跨进程发送消息时,可先通过handler设置消息发送的延迟时间以及消息的消息等级,以便按照延迟时间和消息等级对待发送消息列表中的消息进行逐一发送。在发送时,判断当前所处线程是否为主线程,若为主线程,则确定广播意图,该广播意图包括消息和订阅者的标识信息,并通过广播方式将广播意图传递给订阅者对应的广播接收器;否则,先通过handler将当前所处线程切换至主线程,然后确定广播意图,并通过广播方式将广播意图传递给订阅者对应的广播接收器。广播接收器在接收到广播意图后,获取广播意图中的消息和订阅者的标识信息,并对消息进行格式转换,然后通过可观察存储器类如livedata类将消息传递给进程内的订阅者,即先进行跨进程通信,然后再进行进程内的通信。需要说明的是,广播接收器处于订阅者对应的主线程内。[0048]在上述实施例中,通过广播方式可实现跨进程消息发送,同时基于handler能够实现消息的延迟发送和有序发送,解决了跨进行消息发送时消息无法延迟发送和有序发送的问题。[0049]图2为根据本发明一个具体示例的用于安卓系统的消息传递方法的流程图,参考图2所示,该用于安卓系统的消息传递方法可包括以下步骤:[0050]步骤s201,对消息进行格式转换。[0051]步骤s202,将格式转换后的消息写入跨进程消息载体bundle中。[0052]步骤s203,将跨进程消息载体存储至待发送消息列表haspmap中。[0053]步骤s204,判断是否为进程内发送消息。若是,则执行步骤s205或步骤s206;否则,执行步骤s210或步骤s211。[0054]步骤s205,通过handler设置消息发送的延迟时间以延迟发送消息。[0055]步骤s206,通过handler设置消息的消息等级以有序发送消息。[0056]步骤s207,判断当前所处线程是否为主线程。若是,则执行步骤s209;否则,执行步骤s208。[0057]步骤s208,通过handler将当前所处线程切换至主线程。[0058]步骤s209,设置livedata类的值。[0059]步骤s210,通过handler设置消息发送的延迟时间以延迟发送消息。[0060]步骤s211,通过handler设置消息的消息等级以有序发送消息。[0061]步骤s212,判断当前所处线程是否为主线程。若是,则执行步骤s214;否则,执行步骤s213。[0062]步骤s213,通过handler将当前所处线程切换至主线程。[0063]步骤s214,定义广播意图,通过broadcast发送广播意图。[0064]需要说明的是,步骤s201至步骤s214主要实现发布者对消息的发布。[0065]步骤s215,判断当前所处线程是否为主线程。若是,则执行步骤s217;否则,执行步骤s216。[0066]步骤s216,通过handler将当前所处线程切换至主线程。[0067]步骤s217,定义消息回调方法,通过继承livedata类中的mutablelivedata,重写observe,将回调方法添加到订阅者队列中。[0068]步骤s218,定义lifecyclelivedata继承livedata类,重写livedata类中的removeobserver,在订阅者被取消或activity和fragment的生命周期被销毁,通过removeobserver将haspmap中的相应消息删除。[0069]步骤s219,判断当前所处线程是否为主线程。若是,则执行步骤s221;否则,执行步骤s220。[0070]步骤s220,通过handler将当前所处线程切换至主线程。[0071]步骤s221,定义广播接收器类,继承broadcastreceiver,重写onreceive来接收广播意图,获取广播意图中的消息并进行格式转换。[0072]步骤s222,设置livedata类的值,以将消息传递给进程内订阅者。[0073]需要说明的是,步骤s215至步骤s222主要实现订阅者者对消息的接收。[0074]综上所述,根据本发明实施例的用于安卓系统的消息传递方法,在接收到消息发送请求后,判断是否为进程内发送消息,若为进程内发送消息,则根据消息设置可观察存储器类的值,以便消息的订阅者基于可观察存储器类接收消息并进行消息回调,由于可观察存储器类具备生命周期感知,因而通过可观察存储器类进行消息传递,能够有效减少内存泄露的风险;若为跨进程发送消息,则确定广播意图,并通过广播方式将广播意图传递给订阅者,以便订阅者根据广播意图获取消息,由此实现跨进程通信。同时,基于handler能够实现消息的延迟发送和有序发送,解决了消息无法延迟发送和有序发送的问题,并且能够有效减少应用包的体积,如eventbus包的大小为57kb,rxbus包的大小为2.2mb,而本申请对应的应用包的大小可达15kb。[0075]另外,本发明的实施例还提供一种计算机可读存储介质,其上存储有用于安卓系统的消息传递程序,该消息传递程序被处理器执行时实现上述的用于安卓系统的消息传递方法。[0076]根据本发明实施例的计算机可读存储介质,通过上述的用于安卓系统的消息传递方法,不仅能够有效减少内存泄露的风险,而且能够实现跨进程通信。[0077]需要说明的是,在流程图中表示或在此以其他方式描述的逻辑和/或步骤,例如,可以被认为是用于实现逻辑功能的可执行指令的定序列表,可以具体实现在任何计算机可读介质中,以供指令执行系统、装置或设备(如基于计算机的系统、包括处理器的系统或其他可以从指令执行系统、装置或设备取指令并执行指令的系统)使用,或结合这些指令执行系统、装置或设备而使用。就本说明书而言,"计算机可读介质"可以是任何可以包含、存储、通信、传播或传输程序以供指令执行系统、装置或设备或结合这些指令执行系统、装置或设备而使用的装置。计算机可读介质的更具体的示例(非穷尽性列表)包括以下:具有一个或多个布线的电连接部(电子装置),便携式计算机盘盒(磁装置),随机存取存储器(ram),只读存储器(rom),可擦除可编辑只读存储器(eprom或闪速存储器),光纤装置,以及便携式光盘只读存储器(cdrom)。另外,计算机可读介质甚至可以是可在其上打印所述程序的纸或其他合适的介质,因为可以例如通过对纸或其他介质进行光学扫描,接着进行编辑、解译或必要时以其他合适方式进行处理来以电子方式获得所述程序,然后将其存储在计算机存储器中。[0078]应当理解,本发明的各部分可以用硬件、软件、固件或它们的组合来实现。在上述实施方式中,多个步骤或方法可以用存储在存储器中且由合适的指令执行系统执行的软件或固件来实现。例如,如果用硬件来实现,和在另一实施方式中一样,可用本领域公知的下列技术中的任一项或他们的组合来实现:具有用于对数据信号实现逻辑功能的逻辑门电路的离散逻辑电路,具有合适的组合逻辑门电路的专用集成电路,可编程门阵列(pga),现场可编程门阵列(fpga)等。[0079]在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。[0080]此外,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括至少一个该特征。在本发明的描述中,“多个”的含义是至少两个,例如两个,三个等,除非另有明确具体的限定。[0081]在本发明中,除非另有明确的规定和限定,术语“安装”、“相连”、“连接”、“固定”等术语应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或成一体;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连,可以是两个元件内部的连通或两个元件的相互作用关系,除非另有明确的限定。对于本领域的普通技术人员而言,可以根据具体情况理解上述术语在本发明中的具体含义。[0082]尽管上面已经示出和描述了本发明的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本发明的限制,本领域的普通技术人员在本发明的范围内可以对上述实施例进行变化、修改、替换和变型。当前第1页1 2 3 当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1