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