APP下载

利用接口回调实现Android中Fragment之间的通信

2017-12-30陆志平胡晨骏

现代计算机 2017年31期
关键词:数据通信服务端控件

陆志平,胡晨骏

(南京中医药大学信息技术学院,南京 210046)

利用接口回调实现Android中Fragment之间的通信

陆志平,胡晨骏

(南京中医药大学信息技术学院,南京 210046)

Fragment控件是可以嵌入到Activity中的一个UI片段,在项目中它们之间需要进行频繁的数据通信。对比Fragment之间的各种数据通信方式,提出利用接口回调实现Fragment之间的数据通信。对Fragment的特点,接口回调系统的实现进行系统的阐述,并给出利用接口回调实现Fragment之间数据通信的实现过程。

Android;Fragment;通信;回调

0 引言

在Android程序设计中,Activity是最重要的组件之一,它为用户提供一个交互的界面。但若每个界面切换都采用Activity会降低软件的运行效率,增加系统开销。例如新闻客户端,它包含了多个不同的类别,用户可以在各个类别之间进行切换。若采用Activity来显示各个类别的新闻,那每个类别需要建立对应的Activity,每次Activity进行转换的时候,需要保存当前Activity的状态、传递信息或者新建Activity,几十个Activity不断地进行转换将耗费较多的资源。

Android系统引入Fragment来解决此问题。Fragment是碎片、片段的意思。在Android中表示的是一种可以嵌入到Activity中的UI片段,它是Activity的界面中的一部分,可以用于单个Activity上切换多个UI界面,以显示不同内容[1]。

1 Fragment控件

由于Fragment必须被嵌入到一个Activity中,所以它的生命周期受到Activity的生命周期的影响[2]。例如,当Activity暂停时,Activity中所有的Fragment也处于暂停状态;当Activity被销毁时,所有隶属于此Activity的Fragment也会被销毁。而当Activity处于运行状态时,用户可以独立的操作每一个Fragment,例如进行添加、删除等操作。此类操作称为一个Fragment事务。在程序中,可以将此事务添加到Activity管理的后退栈中,这样用户按下Back键后,就可以按照回退栈的顺序返回上一个事务[3]。

创建Fragment的方法有静态与动态两种。静态创建就是在Activity的布局文件中通过标签添加;动态创建就是在Activity的代码中创建Fragment的实例,然后将其加入到Activity中的ViewGroup中。

2 接口回调

回调是程序设计中的一种双向调用模式,即被调用方法在被调时也会调用主调对象中的方法[4]。被调方法提供某个功能调用,所以这里将被调方法所在对象称为服务端;主调对象通过调用服务端提供的方法实现某个功能,所以将主调对象称为客户端。由于服务端方法在执行过程中还会调用客户端对象的某个方法,所以在客户端调用服务端方法时,还需要将客户端对象作为参数传送至服务端。其设计过程如下。

(1)在客户端调用服务端的被调方法。回调体系中,在调用的过程中客户端需将自身对象作为调用方法的参数传递至服务端对象。

(2)设计服务端的被调方法。在此方法中通过传递过来的客户端对象来回调客户端的某个方法。

(3)设计客户端被回调的方法。

出于提高代码的重复利用效率方面考虑,服务端被调函数中回调客户端对象方法部分可以设计成接口形式,即只要实现了此接口的对象都可以调用服务端的被调方法[5],而在服务端被调函数中回调此接口对象的方法即可。

3 接口回调实现Fragmen之间的通信

由于Fragment作为Activity的一部分,那不同的Fragment之间必然需要互相通信。Fragment之间当然可以直接进行数据通信,并且Android的API中也提供了这样的功能。例如当前Activity中有两个Fragment,分别为Fragment1与Fragment2。若在Fragment1中通过代码实现了到Fragment2的切换,那么Fragment1只能切换到Fragment2,如果要再增加一个Fragment3,那么就要重新编写Fragment1和Fragment2类的代码。所以,考虑Fragment的重复使用,所以必须降低Fragment之间或者Fragment与Activity的耦合,并且在Fragment中不应该直接操作别的Fragment对象,因为Fragment操作应该由它的管理者Activity来决定。

上述问题可以通过回调来实现。原先Activity与Fragment仅是简单的调用关系,Activity会自动调用Fragment中的方法,在调用过程中Activity会将自身对象传过去,但并没有实现回调关系。它们之间实现了Activity-->Fragment这样一个过程。项目中需要改变Activity与Fragment的子类来实现回调体系。

首先要明确的是在回调的体系中,哪个是客户端,哪个是服务端。设计Fragment的目的是让它集成一些控件,并且完成控件的一些操作,即通过集成的这些控件来完成一些功能。例如列表控件的绑定,点击事件的处理等。Fragment提供了这些功能来被调用,所以Fragment是被调用端,即服务端。而Activity需要通知Fragmen需要完成什么功能,所以Activity是客户端,用来提出功能请求的。

在创建 Fragment对象时,Activity会自动调用Fragment中的方法,例如 onAttach(),onCreatView()等,并且在调用的时候,会将自身作为对象传进去,所以在项目中需要在Fragment中设计回调。回调的过程是这样的:Activity-->fragment-->Activity,即请求-->处理并回调-->执行Activity的回调方法。

综上所述,设计Activity与Fragment回调的步骤如下:

(1)设计一个Fragment的子类作为服务端。

(2)设计一个接口,此接口就是客户端需要实现的接口。

(3)在Fragment子类中设计被调方法,并在方法中进行客户端的回调,调用客户端实现的接口方法,在此方法调用中将服务端的数据传送至客户端Activity。

(4)创建Activity子类,实现第2步定义的接口中的方法,处理服务端中传过来的数据。

通过上述的4个步骤,完成了由Activity主导的Fragment之间数据通信。

4 结语

Fragment通信的方式有多种,例如上面阐述的Fragment之间直接进行数据传输,也可以利用软件的公用存储对象等方式[6],但是本文说阐述的接口回调方式具有效率高、实现简洁方便、出错概率小等优点,是Fragment之间通信的最优方式。

[1]郭宏志.Android应用开发详解[M].电子工业出版社,2010.

[2]关晶鑫,李永全.Android中的Activity生命周期[J].电脑知识与技术,2013(11):2713-2715.

[3]陆志平,胡晨骏.Android应用交互及任务栈处理[J].计算机系统应用,2017,26(6):213-220.

[4]彭涛,孙连英.回调机制及其在Android应用开发中的应用[J].北京联合大学学报:自然科学版,2013,27(2):68-72.

[5]牛靖宇,王晨辉,宋世军,等.计算机软件系统中基于构件接口实现事件回调的方法:,CN101196813[P].2008.

[6]夏德冰,陈庆奎.Android应用中一种Activity窗口管理系统[J].计算机系统应用,2012,21(6):224-227.

Implementation of Communication between Fragment in Android Using Interface Callback

LU Zhi-ping,HU Cheng-jun
(College of Information and Technology,Nanjing University of Chinese Medicine,Nanjing 210046)

The control of Fragment is a UI fragment that can be embedded in the Activity,in the project between them need to carry out frequent data communication.Compared with the various data communication between Fragment,proposes the use of interface callback to achieve Fragment between the data communication.Systematically describes the implementation of Fragment and the interface callback system,and gives the realization process of data communication between Fragment by using interface callback.

Android;Fragment;Communication;Callback

1007-1423(2017)31-0084-03

10.3969/j.issn.1007-1423.2017.31.021

陆志平(1978-),男,江苏宜兴人,硕士,讲师,研究方向为嵌入式技术的发展与应用

2017-08-15

2017-10-20

猜你喜欢

数据通信服务端控件
使用“填表单”微信小程序 统计信息很方便
基于.net的用户定义验证控件的应用分析
数据通信网络维护与网络安全问题探讨
关于.net控件数组的探讨
新时期《移动Web服务端开发》课程教学改革的研究
基于三层结构下机房管理系统的实现分析
基于三层结构下机房管理系统的实现分析
基于EDA技术的通用异步收发器设计
北斗卫星同步技术在电力行业中的运用简析
优化网络设备维护提高数据通信传输质量