Android中不同对象间的信息交互方法、装置、设备和存储介质与流程

文档序号:16529424发布日期:2019-01-05 10:37阅读:128来源:国知局
Android中不同对象间的信息交互方法、装置、设备和存储介质与流程

本发明实施例涉及计算机技术,尤其涉及一种android中不同对象间的信息交互方法、装置、设备和存储介质。



背景技术:

android系统的应用程序开发中,两个不同对象之间的信息交互方式大致有两种:第一种是对象直接引用,这种情况下两个对象同处一个功能模块中;第二种是通过接口类通信协议桥接引用,这种情况下两个对象分处于不同的功能模块中,对象之间无法直接引用,故通过通信协议进行对象的引用。

在实际的应用程序开发过程中,由于应用软件的改进,通常会出现上述两种信息交互方式的切换。例如,在音视频播放/直播应用软件的开发过程中,最初将其中具有弹幕消息分发功能的分发模块和具有弹幕消息接收功能的接收模块划分为两个独立的功能模块。这样,分发模块中的弹幕分发对象和接收模块中的弹幕接收对象就分处于不同的功能模块中,该两个对象之间的信息交互是通过第二种方式实现的。而后,由于应用程序开发的功能调整,需要进行功能模块的整合,将分发模块和接收模块整合为一个功能模块,这时弹幕分发对象和弹幕接收对象之间的信息交互方式便需要由第二种变更为第一种。具体的变更过程则是删除与通信协议相关的代码,并在弹幕接收对象中重新定义接收弹幕消息的成员函数,进而增加对象直接引用的代码。反之,若后续需要进行功能模块的拆分,则需要增加通信协议相关代码,且须保持通信协议的内部协议函数与上述成员函数不同,以便进行区分调用。

综上,现有技术中由于功能模块的整合与拆分,而进行两个不同对象之间的信息交互方式的切换时,其操作过程较为繁琐,不仅耗时,且极易出错,从而降低应用程序的开发效率。



技术实现要素:

本发明实施例提供一种android中不同对象间的信息交互方法、装置、设备和存储介质,以实现android系统中不同的对象处于同一功能模块和不同功能模块时,对象之间信息交互方式的快速切换,提高了应用程序内部代码的动态变化程度,从而提高了应用程序的可用性和健壮性。

第一方面,本发明实施例提供了一种android中不同对象间的信息交互方法,包括:

当第一对象和第二对象存在于同一个功能模块时,所述第一对象通过所述第二对象调用第一信息传输函数,将所述第一对象中的交互信息传输至所述第二对象;

当所述第一对象和所述第二对象存在于不同的功能模块时,所述第一对象从预先构建的协议对象集合中获取所述第二对象对应的目标协议对象;

所述第一对象通过所述目标协议对象,调用第二信息传输函数,将所述交互信息传输至所述协议对象,其中,所述第二信息传输函数为所述第二对象继承预先定义的交互协议而获得;所述第一信息传输函数与所述第二信息传输函数的函数设置相同。

第二方面,本发明实施例还提供了一种android中不同对象间的信息交互装置,该装置包括:

第一交互模块,用于当第一对象和第二对象存在于同一个功能模块时,所述第一对象通过所述第二对象调用第一信息传输函数,将所述第一对象中的交互信息传输至所述第二对象;

目标协议对象获取模块,用于当所述第一对象和所述第二对象存在于不同的功能模块时,所述第一对象从预先构建的协议对象集合中获取所述第二对象对应的目标协议对象;

第二交互模块,用于所述第一对象通过所述目标协议对象,调用第二信息传输函数,将所述交互信息传输至所述协议对象,其中,所述第二信息传输函数为所述第二对象继承预先定义的交互协议而获得;所述第一信息传输函数与所述第二信息传输函数的函数设置相同。

第三方面,本发明实施例还提供了一种设备,该设备包括:

一个或多个处理器;

存储装置,用于存储一个或多个程序,

当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现本发明任意实施例所提供的android中不同对象间的信息交互方法。

第四方面,本发明实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现本发明任意实施例所提供的android中不同对象间的信息交互方法。

本发明实施例通过预先定义交互协议及作为协议内部函数的第二信息传输函数,并使第二对象预先继承该交互协议以获得复写的第二信息传输函数,以及在第二对象中定义与第二信息传输函数的函数设置相同的第一信息传输函数,使得android系统中的第一对象和第二对象之间既可以通过对象直接引用的方式来交互,也可以通过接口类通信协议桥接引用的方式来交互,为后续进行两种交互方式的快速切换提供基础。通过当第一对象和第二对象存在于同一个功能模块时,调用第一信息传输函数进行信息交互,实现了第一对象和第二对象处于同一功能模块时的信息交互;当第一对象和第二对象存在于不同的功能模块时,从协议对象集合中获取第二对象对应的目标协议对象,并调用目标协议对象中的第二信息传输函数进行信息交互,实现了第一对象和第二对象处于不同功能模块时的信息交互。从而实现了两个对象之间不同信息交互方式的快速切换,提高了应用程序内部代码的动态变化程度,减少了切换交互方式过程中的代码修改量,进而提高了应用程序的可用性和健壮性,也提高了应用软件开发灵活性和开发效率,降低了应用程序的代码维护难度。

附图说明

图1是本发明实施例一中的一种android中不同对象间的信息交互方法的流程图;

图2是本发明实施例二中的一种android中不同对象间的信息交互装置的结构示意图;

图3是本发明实施例三中的一种设备的结构示意图。

具体实施方式

下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部结构。

实施例一

本实施例提供的android中不同对象间的信息交互方法可适用于android系统中不同对象之间的信息交互,尤其适用于不同的对象既可以设置在不同的功能模块,又可以设置在同一个功能模块的情况。该方法可以由android中不同对象间的信息交互装置来执行,该装置可以由软件和/或硬件的方式实现,该装置可以集成在搭载android系统的设备中,例如典型的是用户终端设备,例如手机、平板电脑或台式电脑等。参见图1,本实施例的方法具体包括如下步骤:

s110、当第一对象和第二对象存在于同一个功能模块时,第一对象通过第二对象调用第一信息传输函数,将第一对象中的交互信息传输至第二对象。

其中,第一对象和第二对象用于表征android系统的应用程序中需要进行信息交互的不同的对象。可以将第一对象理解为弹幕分发对象,将第二对象理解为弹幕接收对象。应当说明的是,第一对象可以是一个对象,也可以是多个对象;同样地,第二对象可以是一个对象,也可以是多个对象。本发明实施例中以第一对象和第二对象均为一个对象为例进行说明。

第一信息传输函数是指预先定义的,用于进行信息传输的函数,其是定义在第二对象中的一个普通函数。例如,第一信息传输函数可以定义为publicvoidonreceivemsg(stringtype,objectcontent);其中,public为公有权项修饰符,表明该第一信息传输函数onreceivemsg可以被其他类和对象访问;void表示无类型,表明第一信息传输函数onreceivemsg没有函数返回值;type和content均是第一信息传输函数onreceivemsg的函数输入参数,分别表示交互信息的信息标识和信息体,且信息标识type的数据类型为字符串类型,信息体content的数据类型为祖先类object类型object,即信息体content的数据类型可以兼容任意数据类型。这里信息标识是指能够标识交互信息的字符,其可以是数字、字母、符号及上述各种字符的任意组合,该信息标识应当是一条交互信息的唯一的、全局的标识。信息体是指交互信息的承载者,其内包含具体的交互信息内容。

具体地,在第一对象和第二对象进行信息交互之前,先判断两个对象是否处于同一个功能模块中,以便后续确定需要调用的代码段。具体实施时可以通过预先设定的模块标识值判断第一对象和第二对象是否存在于同一个功能模块中。例如当两个对象处于同一个功能模块时,将模块标识值设置为诸如0的第一标识值,当两个对象分处于两个不同的功能模块时,将模块标识值设置为诸如1的第二标识值,后续则根据模块标识值为第一标识值或第二标识值来判断两个对象的存在位置关系。也可以通过查找两个对象所在的功能模块名称,比较名称是否相同,以判断是否同处一个功能模块等。

通过上述判断过程,如果判断第一对象和第二对象同处一个功能模块中,那么两个对象之间是可以直接进行对象引用的,这时,第一对象获得第二对象。之后,第一对象将其内的交互信息解析为信息标识type与信息体content的形式,并将type与content作为函数输入参数,通过第二对象调用第一信息传输函数,将交互信息传输至第二对象中。

s120、当第一对象和第二对象存在于不同的功能模块时,第一对象从预先构建的协议对象集合中获取第二对象对应的目标协议对象。

其中,协议对象集合是指存储各个临时协议对象的集合,其是一个全局集合。由于协议对象集合存储各个临时协议对象,故该集合的数据类型应当是与临时协议对象所具有的协议功能的协议类型一致。目标协议对象是指仅具有协议对象功能的对象,其与第二对象的对象名称及对象的引用地址均相同,即目标协议对象与第二对象相对应。

上述临时协议对象是指兼具原生对象(即组件对象)功能和通信协议功能的双重功能的对象。本实施例中临时协议对象也与第二对象相对应,只是临时协议对象除了是第二对象之外,其还是一个具有交互协议的跨模块通信功能的协议对象。这里的交互协议是指android系统中不同功能模块中的组件进行跨模块交互的组件间通信协议。

具体地,通过s110中的判断过程,如果判断第一对象和第二对象分处不同的功能模块中,那么两个对象之间是不可以直接进行对象引用的。这时,需要建立第一对象和第二对象之间的通信通道,以便进行对象的桥接引用。具体实施时,为了实现第一对象和第二对象之间的桥接,需要预先定义一个交互协议。进一步为了便于进行对象的桥接引用,使第二对象继承上述交互协议,并将继承了交互协议后的第二对象,也就是临时协议对象,存储至具有全局作用域的协议对象集合。之后,第一对象便可以通过访问协议对象集合,获得第二对象对应的目标协议对象。至此,第一对象持有了第二对象的引用关系,而第二对象继承有交互协议,则第一对象和第二对象之间的通信通道得以建立。

s130、第一对象通过目标协议对象,调用第二信息传输函数,将交互信息传输至协议对象。

其中,第二信息传输函数是交互协议的协议内部函数,其是一个用于进行信息传输的函数。示例性地,第二信息传输函数为第二对象继承预先定义的交互协议而获得;第一信息传输函数与第二信息传输函数的函数设置相同。定义交互协议时,会同时定义其协议内部函数。那么第二对象继承交互协议时,便需要复写协议内部函数,则继承交互协议后的第二对象也就获得了第二信息传输函数。这样,第二对象中便同时有了作为普通函数的第一信息函数和作为协议复写函数的第二信息函数。一般情况下,为了避免函数调用混乱,是要求将的第一信息函数和第二信息函数设置为两个不同的函数,至少函数名称设置不同。但是,本发明实施例中为了实现第一对象和第二对象处于同一功能模块和不同功能模块时,对象之间两种信息交互方式的快速切换,减少代码修改量,将作为普通函数的第一信息函数和作为协议复写函数的第二信息函数的设置为两个函数设置相同的函数。这时,无论通过哪种方式调用函数,信息传输的函数执行过程是相同的,也就可以实现两种交互方式的快速切换。

示例性地,交互协议为具有公有权限修饰符的接口类型,且包含第二信息传输函数;第二信息传输函数具有公有权限修饰符;函数设置相同包括:函数访问权限、函数返回值类型、函数名称和函数输入参数相同。具体地,交互协议是为了便于其他类的继承,所以将其定义为具有公有权项public的接口interface类型。根据上述说明,交互协议中包含第二信息传输函数,且第二信息传输函数与第一信息传输函数设置相同,那么根据第一信息传输函数的说明,可将第二信息传输函数设置为具有公有权项修饰符的函数。进一步地,可将第二信息传输函数的函数访问权限、函数返回值类型、函数名称和函数输入参数均设置为与第一信息函数的相应属性相同。例如可以将交互协议isendmsg定义为:

publicinterfaceisendmsg{

publicvoidonreceivemsg(stringtype,objectcontent);

}。

具体地,第一对象获得目标协议对象之后,将交互信息解析为信息标识type与信息体content的形式,并将type与content作为函数输入参数,通过目标协议对象,调用其中复写的第二信息传输函数,将交互信息传输至第二对象中。需要说明的是,第二对象在复写协议内部函数时,由于第一信息传输函数与第二信息传输函数的上述设置相同,故只需在第一信息传输函数之前添加“@override”语句即可实现协议函数的复写,简化了协议继承实现过程,进一步减少代码修改量,从而进一步提高应用程序可用性和代码动态变化程度。

通过上述设置,当应用程序内部进行功能模块整合时,第一对象可以直接通过第一信息传输函数进行信息交互;当应用程序内部需要进行功能模块拆分时,第二对象可以通过协议对象集合将相应的协议信息注册至第一对象中,以便第一对象通过集合获得第二对象对应的目标协议对象,并通过目标协议对象中设置有复写关键词“@override”的第二信息传输函数进行信息交互。这样便可实现两种信息交互方式之间的双向转换,很大程度上提高了应用软件项目的开发灵活性及开发人员的开发效率。

本实施例的技术方案,通过预先定义交互协议及作为协议内部函数的第二信息传输函数,并使第二对象预先继承该交互协议以获得复写的第二信息传输函数,以及在第二对象中定义与第二信息传输函数的函数设置相同的第一信息传输函数,使得android系统中的第一对象和第二对象之间既可以通过对象直接引用的方式来交互,也可以通过接口类通信协议桥接引用的方式来交互,为后续进行两种交互方式的快速切换提供基础。通过当第一对象和第二对象存在于同一个功能模块时,调用第一信息传输函数进行信息交互,实现了第一对象和第二对象处于同一功能模块时的信息交互;当第一对象和第二对象存在于不同的功能模块时,从协议对象集合中获取第二对象对应的目标协议对象,并调用目标协议对象中的第二信息传输函数进行信息交互,实现了第一对象和第二对象处于不同功能模块时的信息交互。从而实现了两个对象之间不同信息交互方式的快速切换,提高了应用程序内部代码的动态变化程度,减少了切换交互方式过程中的代码修改量,进而提高了应用程序的可用性和健壮性,也提高了应用软件开发灵活性和开发效率,降低了应用程序的代码维护难度。

在上述技术方案的基础上,第一对象从预先构建的协议对象集合中获取第二对象对应的目标协议对象包括:第一对象从预先构建的协议对象集合中获取第二对象对应的临时协议对象;依据交互协议对应的交互协议类型,将临时协议对象转换为交互协议类型的对象,作为目标协议对象。

具体地,第一对象在向第二对象传输交互信息时,是通过预先定义的交互协议进行的,其在获取对象之间的引用关系时,是基于交互协议来识别对象及获取对象的。但是,根据上述说明可知,虽然第二对象对应的临时协议对象已经继承了交互协议,属于一种交互协议的协议对象,但其同时还是组件对象。如果直接利用临时协议对象进行后续交互操作,难免存在对象功能的使用混乱。尤其是第二对象中的第一信息传输函数与临时协议对象中复写而来的第二信息传输函数的函数设置相同的情况下,函数调用混乱的情况更甚。所以,为了使得临时协议对象的功能单一化,从而便于后续基于交互协议的信息交互的执行,需将临时协议对象设置为单纯的交互协议的协议对象。具体实施时,第一对象先从协议对象集合中获取到第二对象对应的临时协议对象。之后,再以定义交互协议后的交互协议类型为类型转换字符,将获得的临时协议对象强制转换为交互协议类型的对象,这时该强制转换后的对象便是一个单纯具有协议对象功能的对象,即目标协议对象。

在上述技术方案的基础上,协议对象集合通过如下方式预先构建:依据交互协议创建协议对象集合;在创建第二对象之后,第二对象通过协议继承关键字继承交互协议,获得第二对象对应的临时协议对象;以临时协议对象为函数输入参数,调用协议对象集合的集合元素添加函数,将临时协议对象添加至协议对象集合。

具体实施时,根据交互协议isendmsg定义,确定交互协议isendmsg类型,并进一步创建集合元素数据类型为交互协议isendmsg类型的协议对象集合mreceivelist。创建集合后,需要对其进行初始化,例如可以利用android系统的动态数组类arraylist,对协议对象集合mreceivelist进行初始化,其代码实现可以是list<isendmsg>mreceivelist=newarraylist<isendmsg>()。之后需要将第二对象对应的临时协议对象添加至初始化后的协议对象集合,添加时机是第二对象被实例化之后,在第二对象的生命周期内,先通过java语言中规定的进行接口继承的关键字implements(即协议继承关键字),使得第二对象继承交互协议成为临时协议对象receiver。然后,以临时协议对象为函数输入参数,调用协议对象集合的集合元素添加函数,即mreceivelist.add(receiver),将临时协议对象receiver添加至协议对象集合,生成包含了临时协议对象的集合。这样就将第二对象对应的临时协议对象注册至第一对象,为实现第一对象持有第二对象的引用关系提供基础。应当理解的是,当第二对象销毁时,需要将其对应的临时协议对象从协议对象集合中删除,即在销毁第二对象之前,以该第二对象对应的临时协议对象为函数输入参数,调用集合元素删除函数mreceivelist.remove(receiver),将该临时协议对象从协议对象集合中删除。这样设置的好处在于可以保证协议对象集合中第二对象对应的临时协议对象及时更新,有效避免交互信息传输过程中的无效操作。

以下是本发明实施例提供的android中不同对象间的信息交互装置的实施例,该装置与上述各实施例的android中不同对象间的信息交互方法属于同一个发明构思,在android中不同对象间的信息交互装置的实施例中未详尽描述的细节内容,可以参考上述android中不同对象间的信息交互方法的实施例。

实施例二

本实施例提供一种android中不同对象间的信息交互装置,参见图2,该装置具体包括:

第一交互模块210,用于当第一对象和第二对象存在于同一个功能模块时,第一对象通过第二对象调用第一信息传输函数,将第一对象中的交互信息传输至第二对象;

目标协议对象获取模块220,用于当第一对象和第二对象存在于不同的功能模块时,第一对象从预先构建的协议对象集合中获取第二对象对应的目标协议对象;

第二交互模块230,用于第一对象通过目标协议对象,调用第二信息传输函数,将交互信息传输至协议对象,其中,第二信息传输函数为第二对象继承预先定义的交互协议而获得;第一信息传输函数与第二信息传输函数的函数设置相同。

其中,交互协议为具有公有权限修饰符的接口类型,且包含第二信息传输函数;第二信息传输函数具有公有权限修饰符;

函数设置相同包括:函数访问权限、函数返回值类型、函数名称和函数输入参数相同。

可选地,目标协议对象获取模块220具体用于:

第一对象从预先构建的协议对象集合中获取第二对象对应的临时协议对象;

依据交互协议对应的交互协议类型,将临时协议对象转换为交互协议类型的对象,作为目标协议对象。

在上述装置的基础上,该装置还包括:协议对象集合构建模块,用于通过如下方式预先构建协议对象集合:

依据交互协议创建协议对象集合;

在创建第二对象之后,第二对象通过协议继承关键字继承交互协议,获得第二对象对应的临时协议对象;

以临时协议对象为函数输入参数,调用协议对象集合的集合元素添加函数,将临时协议对象添加至协议对象集合。

通过本发明实施例二的一种android中不同对象间的信息交互装置,实现了android系统中不同的对象处于同一功能模块和不同功能模块时,对象之间信息交互方式的快速切换,提高了应用程序内部代码的动态变化程度,从而提高了应用程序的可用性和健壮性。

本发明实施例所提供的android中不同对象间的信息交互装置可执行本发明任意实施例所提供的android中不同对象间的信息交互方法,具备执行方法相应的功能模块和有益效果。

值得注意的是,上述android中不同对象间的信息交互装置的实施例中,所包括的各个单元和模块只是按照功能逻辑进行划分的,但并不局限于上述的划分,只要能够实现相应的功能即可;另外,各功能单元的具体名称也只是为了便于相互区分,并不用于限制本发明的保护范围。

实施例三

参见图3,本实施例提供了一种设备300,其包括:一个或多个处理器320;存储装置310,用于存储一个或多个程序,当一个或多个程序被一个或多个处理器320执行,使得一个或多个处理器320实现本发明实施例所提供的android中不同对象间的信息交互方法,包括:

当第一对象和第二对象存在于同一个功能模块时,第一对象通过第二对象调用第一信息传输函数,将第一对象中的交互信息传输至第二对象;

当第一对象和第二对象存在于不同的功能模块时,第一对象从预先构建的协议对象集合中获取第二对象对应的目标协议对象;

第一对象通过目标协议对象,调用第二信息传输函数,将交互信息传输至协议对象,其中,第二信息传输函数为第二对象继承预先定义的交互协议而获得;第一信息传输函数与第二信息传输函数的函数设置相同。

当然,本领域技术人员可以理解,处理器320还可以实现本发明任意实施例所提供的android中不同对象间的信息交互方法的技术方案。

图3显示的设备300仅仅是一个示例,不应对本发明实施例的功能和使用范围带来任何限制。

如图3所示,该设备300包括处理器320、存储装置310、输入装置330和输出装置340;设备中处理器320的数量可以是一个或多个,图3中以一个处理器320为例;设备中的处理器320、存储装置310、输入装置330和输出装置340可以通过总线或其他方式连接,图3中以通过总线350连接为例。

存储装置310作为一种计算机可读存储介质,可用于存储软件程序、计算机可执行程序以及模块,如本发明实施例中的android中不同对象间的信息交互方法对应的程序指令/模块(例如,android中不同对象间的信息交互装置中的第一交互模块、目标协议对象获取模块和第二交互模块)。

存储装置310可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序;存储数据区可存储根据终端的使用所创建的数据等。此外,存储装置310可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实例中,存储装置310可进一步包括相对于处理器320远程设置的存储器,这些远程存储器可以通过网络连接至设备。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。

输入装置330可用于接收输入的数字或字符信息,以及产生与设备的用户设置以及功能控制有关的键信号输入。输出装置340可包括显示屏等显示设备。

实施例四

本实施例提供一种包含计算机可执行指令的存储介质,计算机可执行指令在由计算机处理器执行时用于执行一种android中不同对象间的信息交互方法,该方法包括:

当第一对象和第二对象存在于同一个功能模块时,第一对象通过第二对象调用第一信息传输函数,将第一对象中的交互信息传输至第二对象;

当第一对象和第二对象存在于不同的功能模块时,第一对象从预先构建的协议对象集合中获取第二对象对应的目标协议对象;

第一对象通过目标协议对象,调用第二信息传输函数,将交互信息传输至协议对象,其中,第二信息传输函数为第二对象继承预先定义的交互协议而获得;第一信息传输函数与第二信息传输函数的函数设置相同。

当然,本发明实施例所提供的一种包含计算机可执行指令的存储介质,其计算机可执行指令不限于如上所述的方法操作,还可以执行本发明任意实施例所提供的android中不同对象间的信息交互方法中的相关操作。

通过以上关于实施方式的描述,所属领域的技术人员可以清楚地了解到,本发明可借助软件及必需的通用硬件来实现,当然也可以通过硬件实现,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如计算机的软盘、只读存储器(read-onlymemory,rom)、随机存取存储器(randomaccessmemory,ram)、闪存(flash)、硬盘或光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所提供的android中不同对象间的信息交互方法。

注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1