日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android activity 显示无焦点_Android面试题集锦之fragemnt

發布時間:2023/12/3 Android 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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已處于可見狀態,只是還沒有在前臺顯示,因此無法與用戶進行交互。可以簡單理解為Activity已顯示而我們無法看見擺了。

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的整個生命周期方法回調完成。現在我們再回頭看看之前的流程圖,應該是相當清晰了吧。嗯,這就是Activity整個典型的生命周期過程。

小編在這里祝福大家都能找到比圖片里還漂亮的小姐姐做老婆

總結

以上是生活随笔為你收集整理的android activity 显示无焦点_Android面试题集锦之fragemnt的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。