android activity 显示无焦点_Android面试题集锦之fragemnt
大家可以關注一下小編,小編以后會一直更新Android相關技術資料文章。
創建方式
靜態創建
首先我們需要創建一個xml文件,然后創建與之對應的java文件,通過onCreatView()的返回方法進行關聯,最后我們需要在Activity中進行配置相關參數即在Activity的xml文件中放上fragment的位置。
動態創建
動態創建Fragment主要有以下幾個步驟:
創建待添加的fragment實例。
獲取FragmentManager,在Activity中可以直接通過調用 getSupportFragmentManager()方法得到。
開啟一個事務,通過調用beginTransaction()方法開啟。
向容器內添加或替換fragment,一般使用repalce()方法實現,需要傳入容器的id和待添加的fragment實例。
提交事務,調用commit()方法來完成。
Adapter對比
FragmnetPageAdapter在每次切換頁面時,只是將Fragment進行分離,適合頁面較少的Fragment使用以保存一些內存,對系統內存不會多大影響。
FragmentPageStateAdapter在每次切換頁面的時候,是將Fragment進行回收,適合頁面較多的Fragment使用,這樣就不會消耗更多的內存
Activity生命周期
Activity的生命周期如下圖:
動態加載:
動態加載時,Activity的onCreate()調用完,才開始加載fragment并調用其生命周期方法,所以在第一個生命周期方法onAttach()中便能獲取Activity以及Activity的布局的組件;
靜態加載:
1.靜態加載時,Activity的onCreate()調用過程中,fragment也在加載,所以fragment無法獲取到Activity的布局中的組件,但為什么能獲取到Activity呢?
2.原來在fragment調用onAttach()之前其實還調用了一個方法onInflate(),該方法被調用時fragment已經是和Activity相互結合了,所以可以獲取到對方,但是Activity的onCreate()調用還未完成,故無法獲取Activity的組件;
3.Activity的onCreate()調用完成是,fragment會調用onActivityCreated()生命周期方法,因此在這兒開始便能獲取到Activity的布局的組件;
與Activity通信
fragment不通過構造函數進行傳值的原因是因為橫屏切換的時候獲取不到值。
Activity向Fragment傳值:
Activity向Fragment傳值,要傳的值放到bundle對象里;
在Activity中創建該Fragment的對象fragment,通過調用setArguments()傳遞到fragment中;
在該Fragment中通過調用getArguments()得到bundle對象,就能得到里面的值。
Fragment向Activity傳值:
第一種:
在Activity中調用getFragmentManager()得到fragmentManager,,調用findFragmentByTag(tag)或者通過findFragmentById(id),例如:
FragmentManager fragmentManager = getFragmentManager();Fragment fragment = fragmentManager.findFragmentByTag(tag);第二種:
通過回調的方式,定義一個接口(可以在Fragment類中定義),接口中有一個空的方法,在fragment中需要的時候調用接口的方法,值可以作為參數放在這個方法中,然后讓Activity實現這個接口,必然會重寫這個方法,這樣值就傳到了Activity中
Fragment與Fragment之間是如何傳值的:
第一種:
通過findFragmentByTag得到另一個的Fragment的對象,這樣就可以調用另一個的方法了。
第二種:
通過接口回調的方式。
第三種:
通過setArguments,getArguments的方式。
api區別
add
一種是add方式來進行show和add,這種方式你切換fragment不會讓fragment重新刷新,只會調用onHiddenChanged(boolean isHidden)。
replace
而用replace方式會使fragment重新刷新,因為add方式是將fragment隱藏了而不是銷毀再創建,replace方式每次都是重新創建。
commit/commitAllowingStateLoss
兩者都可以提交fragment的操作,唯一的不同是第二種方法,允許丟失一些界面的狀態和信息,幾乎所有的開發者都遇到過這樣的錯誤:無法在activity調用了onSaveInstanceState之后再執行commit(),這種異常時可以理解的,界面被系統回收(界面已經不存在),為了在下次打開的時候恢復原來的樣子,系統為我們保存界面的所有狀態,這個時候我們再去修改界面理論上肯定是不允許的,所以為了避免這種異常,要使用第二種方法。
懶加載
我們經常在使用fragment時,常常會結合著viewpager使用,那么我們就會遇到一個問題,就是初始化fragment的時候,會連同我們寫的網絡請求一起執行,這樣非常消耗性能,最理想的方式是,只有用戶點開或滑動到當前fragment時,才進行請求網絡的操作。因此,我們就產生了懶加載這樣一個說法。
Viewpager配合fragment使用,默認加載前兩個fragment。很容易造成網絡丟包、阻塞等問題。
在Fragment中有一個setUserVisibleHint這個方法,而且這個方法是優于onCreate()方法的,它會通過isVisibleToUser告訴我們當前Fragment我們是否可見,我們可以在可見的時候再進行網絡加載。
從log上看setUserVisibleHint()的調用早于onCreateView,所以如果在setUserVisibleHint()要實現懶加載的話,就必須要確保View以及其他變量都已經初始化結束,避免空指針。
使用步驟:
申明一個變量isPrepare=false,isVisible=false,標明當前頁面是否被創建了
在onViewCreated周期內設置isPrepare=true
在setUserVisibleHint(boolean isVisible)判斷是否顯示,設置isVisible=true
判斷isPrepare和isVisible,都為true開始加載數據,然后恢復isPrepare和isVisible為false,防止重復加載。
關于Android Fragment的懶加載,可以參考下面的鏈接:Fragment的懶加載
Activity
Activity啟動流程
用戶從Launcher程序點擊應用圖標可啟動應用的入口Activity,Activity啟動時需要多個進程之間的交互,Android系統中有一個zygote進程專用于孵化Android框架層和應用層程序的進程。還有一個system_server進程,該進程里運行了很多binder service。例如ActivityManagerService,PackageManagerService,WindowManagerService,這些binder service分別運行在不同的線程中,其中ActivityManagerService負責管理Activity棧,應用進程,task。
點擊Launcher圖標來啟動Activity
用戶在Launcher程序里點擊應用圖標時,會通知ActivityManagerService啟動應用的入口Activity,ActivityManagerService發現這個應用還未啟動,則會通知Zygote進程孵化出應用進程,然后在這個dalvik應用進程里執行ActivityThread的main方法。應用進程接下來通知ActivityManagerService應用進程已啟動,ActivityManagerService保存應用進程的一個代理對象,這樣ActivityManagerService可以通過這個代理對象控制應用進程,然后ActivityManagerService通知應用進程創建入口Activity的實例,并執行它的生命周期方法。
Android繪制流程窗口啟動流程分析
Activity生命周期
Activity的形態
Active/Running:
Activity處于活動狀態,此時Activity處于棧頂,是可見狀態,可與用戶進行交互。
Paused:
當Activity失去焦點時,或被一個新的非全屏的Activity,或被一個透明的Activity放置在棧頂時,Activity就轉化為Paused狀態。但我們需要明白,此時Activity只是失去了與用戶交互的能力,其所有的狀態信息及其成員變量都還存在,只有在系統內存緊張的情況下,才有可能被系統回收掉。
Stopped:
當一個Activity被另一個Activity完全覆蓋時,被覆蓋的Activity就會進入Stopped狀態,此時它不再可見,但是跟Paused狀態一樣保持著其所有狀態信息及其成員變量。
Killed:
當Activity被系統回收掉時,Activity就處于Killed狀態。
Activity會在以上四種形態中相互切換,至于如何切換,這因用戶的操作不同而異。了解了Activity的4種形態后,我們就來聊聊Activity的生命周期。
Activity的生命周期
所謂的典型的生命周期就是在有用戶參與的情況下,Activity經歷從創建,運行,停止,銷毀等正常的生命周期過程。
onCreate
該方法是在Activity被創建時回調,它是生命周期第一個調用的方法,我們在創建Activity時一般都需要重寫該方法,然后在該方法中做一些初始化的操作,如通過setContentView設置界面布局的資源,初始化所需要的組件信息等。
onStart
此方法被回調時表示Activity正在啟動,此時Activity已處于可見狀態,只是還沒有在前臺顯示,因此無法與用戶進行交互??梢院唵卫斫鉃锳ctivity已顯示而我們無法看見擺了。
onResume
當此方法回調時,則說明Activity已在前臺可見,可與用戶交互了(處于前面所說的Active/Running形態),onResume方法與onStart的相同點是兩者都表示Activity可見,只不過onStart回調時Activity還是后臺無法與用戶交互,而onResume則已顯示在前臺,可與用戶交互。當然從流程圖,我們也可以看出當Activity停止后(onPause方法和onStop方法被調用),重新回到前臺時也會調用onResume方法,因此我們也可以在onResume方法中初始化一些資源,比如重新初始化在onPause或者onStop方法中釋放的資源。
onPause
此方法被回調時則表示Activity正在停止(Paused形態),一般情況下onStop方法會緊接著被回調。但通過流程圖我們還可以看到一種情況是onPause方法執行后直接執行了onResume方法,這屬于比較極端的現象了,這可能是用戶操作使當前Activity退居后臺后又迅速地再回到到當前的Activity,此時onResume方法就會被回調。當然,在onPause方法中我們可以做一些數據存儲或者動畫停止或者資源回收的操作,但是不能太耗時,因為這可能會影響到新的Activity的顯示——onPause方法執行完成后,新Activity的onResume方法才會被執行。
onStop
一般在onPause方法執行完成直接執行,表示Activity即將停止或者完全被覆蓋(Stopped形態),此時Activity不可見,僅在后臺運行。同樣地,在onStop方法可以做一些資源釋放的操作(不能太耗時)。
onRestart
表示Activity正在重新啟動,當Activity由不可見變為可見狀態時,該方法被回調。這種情況一般是用戶打開了一個新的Activity時,當前的Activity就會被暫停(onPause和onStop被執行了),接著又回到當前Activity頁面時,onRestart方法就會被回調。
onDestroy
此時Activity正在被銷毀,也是生命周期最后一個執行的方法,一般我們可以在此方法中做一些回收工作和最終的資源釋放。
總結
當Activity啟動時,依次會調用onCreate(),onStart(),onResume(),而當Activity退居后臺時(不可見,點擊Home或者被新的Activity完全覆蓋),onPause()和onStop()會依次被調用。當Activity重新回到前臺(從桌面回到原Activity或者被覆蓋后又回到原Activity)時,onRestart(),onStart(),onResume()會依次被調用。當Activity退出銷毀時(點擊back鍵),onPause(),onStop(),onDestroy()會依次被調用,到此Activity的整個生命周期方法回調完成?,F在我們再回頭看看之前的流程圖,應該是相當清晰了吧。嗯,這就是Activity整個典型的生命周期過程。
小編在這里祝福大家都能找到比圖片里還漂亮的小姐姐做老婆
總結
以上是生活随笔為你收集整理的android activity 显示无焦点_Android面试题集锦之fragemnt的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux搭建邮件服务器(linux 搭
- 下一篇: 安卓内网穿透(安卓内网)