陸志平,胡晨駿
(南京中醫(yī)藥大學(xué)信息技術(shù)學(xué)院,南京 210046)
利用接口回調(diào)實現(xiàn)Android中Fragment之間的通信
陸志平,胡晨駿
(南京中醫(yī)藥大學(xué)信息技術(shù)學(xué)院,南京 210046)
Fragment控件是可以嵌入到Activity中的一個UI片段,在項目中它們之間需要進(jìn)行頻繁的數(shù)據(jù)通信。對比Fragment之間的各種數(shù)據(jù)通信方式,提出利用接口回調(diào)實現(xiàn)Fragment之間的數(shù)據(jù)通信。對Fragment的特點,接口回調(diào)系統(tǒng)的實現(xiàn)進(jìn)行系統(tǒng)的闡述,并給出利用接口回調(diào)實現(xiàn)Fragment之間數(shù)據(jù)通信的實現(xiàn)過程。
Android;Fragment;通信;回調(diào)
在Android程序設(shè)計中,Activity是最重要的組件之一,它為用戶提供一個交互的界面。但若每個界面切換都采用Activity會降低軟件的運行效率,增加系統(tǒng)開銷。例如新聞客戶端,它包含了多個不同的類別,用戶可以在各個類別之間進(jìn)行切換。若采用Activity來顯示各個類別的新聞,那每個類別需要建立對應(yīng)的Activity,每次Activity進(jìn)行轉(zhuǎn)換的時候,需要保存當(dāng)前Activity的狀態(tài)、傳遞信息或者新建Activity,幾十個Activity不斷地進(jìn)行轉(zhuǎn)換將耗費較多的資源。
Android系統(tǒng)引入Fragment來解決此問題。Fragment是碎片、片段的意思。在Android中表示的是一種可以嵌入到Activity中的UI片段,它是Activity的界面中的一部分,可以用于單個Activity上切換多個UI界面,以顯示不同內(nèi)容[1]。
由于Fragment必須被嵌入到一個Activity中,所以它的生命周期受到Activity的生命周期的影響[2]。例如,當(dāng)Activity暫停時,Activity中所有的Fragment也處于暫停狀態(tài);當(dāng)Activity被銷毀時,所有隸屬于此Activity的Fragment也會被銷毀。而當(dāng)Activity處于運行狀態(tài)時,用戶可以獨立的操作每一個Fragment,例如進(jìn)行添加、刪除等操作。此類操作稱為一個Fragment事務(wù)。在程序中,可以將此事務(wù)添加到Activity管理的后退棧中,這樣用戶按下Back鍵后,就可以按照回退棧的順序返回上一個事務(wù)[3]。
創(chuàng)建Fragment的方法有靜態(tài)與動態(tài)兩種。靜態(tài)創(chuàng)建就是在Activity的布局文件中通過
回調(diào)是程序設(shè)計中的一種雙向調(diào)用模式,即被調(diào)用方法在被調(diào)時也會調(diào)用主調(diào)對象中的方法[4]。被調(diào)方法提供某個功能調(diào)用,所以這里將被調(diào)方法所在對象稱為服務(wù)端;主調(diào)對象通過調(diào)用服務(wù)端提供的方法實現(xiàn)某個功能,所以將主調(diào)對象稱為客戶端。由于服務(wù)端方法在執(zhí)行過程中還會調(diào)用客戶端對象的某個方法,所以在客戶端調(diào)用服務(wù)端方法時,還需要將客戶端對象作為參數(shù)傳送至服務(wù)端。其設(shè)計過程如下。
(1)在客戶端調(diào)用服務(wù)端的被調(diào)方法?;卣{(diào)體系中,在調(diào)用的過程中客戶端需將自身對象作為調(diào)用方法的參數(shù)傳遞至服務(wù)端對象。
(2)設(shè)計服務(wù)端的被調(diào)方法。在此方法中通過傳遞過來的客戶端對象來回調(diào)客戶端的某個方法。
(3)設(shè)計客戶端被回調(diào)的方法。
出于提高代碼的重復(fù)利用效率方面考慮,服務(wù)端被調(diào)函數(shù)中回調(diào)客戶端對象方法部分可以設(shè)計成接口形式,即只要實現(xiàn)了此接口的對象都可以調(diào)用服務(wù)端的被調(diào)方法[5],而在服務(wù)端被調(diào)函數(shù)中回調(diào)此接口對象的方法即可。
由于Fragment作為Activity的一部分,那不同的Fragment之間必然需要互相通信。Fragment之間當(dāng)然可以直接進(jìn)行數(shù)據(jù)通信,并且Android的API中也提供了這樣的功能。例如當(dāng)前Activity中有兩個Fragment,分別為Fragment1與Fragment2。若在Fragment1中通過代碼實現(xiàn)了到Fragment2的切換,那么Fragment1只能切換到Fragment2,如果要再增加一個Fragment3,那么就要重新編寫Fragment1和Fragment2類的代碼。所以,考慮Fragment的重復(fù)使用,所以必須降低Fragment之間或者Fragment與Activity的耦合,并且在Fragment中不應(yīng)該直接操作別的Fragment對象,因為Fragment操作應(yīng)該由它的管理者Activity來決定。
上述問題可以通過回調(diào)來實現(xiàn)。原先Activity與Fragment僅是簡單的調(diào)用關(guān)系,Activity會自動調(diào)用Fragment中的方法,在調(diào)用過程中Activity會將自身對象傳過去,但并沒有實現(xiàn)回調(diào)關(guān)系。它們之間實現(xiàn)了Activity-->Fragment這樣一個過程。項目中需要改變Activity與Fragment的子類來實現(xiàn)回調(diào)體系。
首先要明確的是在回調(diào)的體系中,哪個是客戶端,哪個是服務(wù)端。設(shè)計Fragment的目的是讓它集成一些控件,并且完成控件的一些操作,即通過集成的這些控件來完成一些功能。例如列表控件的綁定,點擊事件的處理等。Fragment提供了這些功能來被調(diào)用,所以Fragment是被調(diào)用端,即服務(wù)端。而Activity需要通知Fragmen需要完成什么功能,所以Activity是客戶端,用來提出功能請求的。
在創(chuàng)建 Fragment對象時,Activity會自動調(diào)用Fragment中的方法,例如 onAttach(),onCreatView()等,并且在調(diào)用的時候,會將自身作為對象傳進(jìn)去,所以在項目中需要在Fragment中設(shè)計回調(diào)?;卣{(diào)的過程是這樣的:Activity-->fragment-->Activity,即請求-->處理并回調(diào)-->執(zhí)行Activity的回調(diào)方法。
綜上所述,設(shè)計Activity與Fragment回調(diào)的步驟如下:
(1)設(shè)計一個Fragment的子類作為服務(wù)端。
(2)設(shè)計一個接口,此接口就是客戶端需要實現(xiàn)的接口。
(3)在Fragment子類中設(shè)計被調(diào)方法,并在方法中進(jìn)行客戶端的回調(diào),調(diào)用客戶端實現(xiàn)的接口方法,在此方法調(diào)用中將服務(wù)端的數(shù)據(jù)傳送至客戶端Activity。
(4)創(chuàng)建Activity子類,實現(xiàn)第2步定義的接口中的方法,處理服務(wù)端中傳過來的數(shù)據(jù)。
通過上述的4個步驟,完成了由Activity主導(dǎo)的Fragment之間數(shù)據(jù)通信。
Fragment通信的方式有多種,例如上面闡述的Fragment之間直接進(jìn)行數(shù)據(jù)傳輸,也可以利用軟件的公用存儲對象等方式[6],但是本文說闡述的接口回調(diào)方式具有效率高、實現(xiàn)簡潔方便、出錯概率小等優(yōu)點,是Fragment之間通信的最優(yōu)方式。
[1]郭宏志.Android應(yīng)用開發(fā)詳解[M].電子工業(yè)出版社,2010.
[2]關(guān)晶鑫,李永全.Android中的Activity生命周期[J].電腦知識與技術(shù),2013(11):2713-2715.
[3]陸志平,胡晨駿.Android應(yīng)用交互及任務(wù)棧處理[J].計算機系統(tǒng)應(yīng)用,2017,26(6):213-220.
[4]彭濤,孫連英.回調(diào)機制及其在Android應(yīng)用開發(fā)中的應(yīng)用[J].北京聯(lián)合大學(xué)學(xué)報:自然科學(xué)版,2013,27(2):68-72.
[5]牛靖宇,王晨輝,宋世軍,等.計算機軟件系統(tǒng)中基于構(gòu)件接口實現(xiàn)事件回調(diào)的方法:,CN101196813[P].2008.
[6]夏德冰,陳慶奎.Android應(yīng)用中一種Activity窗口管理系統(tǒng)[J].計算機系統(tǒng)應(yīng)用,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-),男,江蘇宜興人,碩士,講師,研究方向為嵌入式技術(shù)的發(fā)展與應(yīng)用
2017-08-15
2017-10-20