標籤:android
1. 轉屏時候Activity的生命週期
1.1 建立一個Activity,並把各個生命週期列印出來
1.2 運行Activity,得到如下資訊
onCreate-->
onStart-->
onResume-->
1.3 按crtl+f12切換成橫屏時
onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->
1.4 再按crtl+f12切換成豎屏時,發現列印了兩次相同的log
onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->
onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->
1.5 修改AndroidManifest.xml,把該Activity添加 android:configChanges="orientation",執行步驟3
onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->
1.6 再執行步驟4,發現不會再列印相同資訊,但多列印了一行onConfigChanged
onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->
onConfigurationChanged-->
1.7 把步驟5的android:configChanges="orientation" 改成 android:configChanges="orientation|keyboardHidden",執行步驟3,就只列印onConfigChanged
onConfigurationChanged-->
1.8 執行步驟4
onConfigurationChanged-->
onConfigurationChanged-->
總結:
①不設定Activity的android:configChanges時,切屏會重新調用各個生命週期,切橫屏時會執行一次,切豎屏時會執行兩次
②設定Activity的android:configChanges="orientation"時,切屏還是會重新調用各個生命週期,切橫、豎屏時只會執行一次
③設定Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調用各個生命週期,只會執行onConfigurationChanged方法
2. View如何重新整理
3. 類變數和和函數變數有什麼區別
類變數也叫全域變數,函數變數也局部變數,兩者的範圍不同。全域變數作用於整個類,局部變數作用於某個方法,方法結束後,變數消失。
4. Java gc記憶體回收機制
Java GC(Garbage Collection,垃圾收集,記憶體回收)機制,是Java與C++/C的主要區別之一,作為Java開發人員,一般不需要專門編寫記憶體回收和垃圾清理代 碼,對記憶體泄露和溢出的問題,也不需要像C程式員那樣戰戰兢兢。這是因為在Java虛擬機器中,存在自動記憶體管理和垃圾清掃機制。概括地說,該機制對 JVM(Java Virtual Machine)中的記憶體進行標記,並確定哪些記憶體需要回收,根據一定的回收策略,自動的回收記憶體,永不停息(Nerver Stop)的保證JVM中的記憶體空間,放置出現記憶體泄露和溢出問題。
5. Andriod 遇到OOM問題,該怎麼解決?
導致OOM 有以下幾種情況:
① 應用中需要載入大對象,例如Bitmap
解決方案:當我們需要顯示大的bitmap對象或者較多的bitmap的時候,就需要進行壓縮來防止OOM問題。我們可以通過設定BitmapFactory.Optiions的inJustDecodeBounds屬性為true,這樣的話不會載入圖片到記憶體中,但是會將圖片的width和height屬性讀取出來,我們可以利用這個屬性來對bitmap進行壓縮。Options.inSampleSize 可以設定壓縮比
②持有無用的對象使其無法被gc,導致Memory Leak . 也就是我們說的記憶體流失。記憶體泄露初期沒有什麼現象,但是最終會導致記憶體溢出。
6. ANR的幾種情況,如何避免
①Activity主線程 (事件處理線程” / “UI線程) 在5秒內沒有響應輸入事件
②BroadcastReceiver 沒有在10秒內完成返回
③Service也是跑在UI Thread裡的,只是比activity報ANR的閥值要大些,15秒沒有完成返回,出現ANR。
解決辦法都是不在UI線程中做耗時的操作,一般都是啟動子線程,如果要更新UI介面,可以用Handler和Message來完成。
7. 靜態變數和靜態方法
靜態變數 類型說明符是static。
靜態變數屬於靜態儲存方式,其儲存空間為記憶體中的待用資料區(在 靜態儲存區內分配儲存單元),該地區中的資料在整個程式的運行期間一直佔用這些儲存空間(在程式整個運行期間都不釋放),也可以認為是其記憶體位址不變,直 到整個程式運行結束(相反,而auto自動變數,即動態局部變數,屬於動態儲存裝置類別,占動態儲存裝置空間,函數調用結束後即釋放)。靜態變數雖在程式的整個執行過程中始終存在,但是在它範圍之外不能使用。
靜態變數並不是說其就不能改變值,不能改變值的量叫常量。 其擁有的值是可變的 ,而且它會保持最新的值。說其靜態,是因為它不會隨著函數的調用和退出而發生變化。即上次調用函數的時候,如果我們給靜態變數賦予某個值的話,下次函數調用時,這個值保持不變。
靜態方法是使用公用記憶體空間的,就是說所有對象都可以直接引用,不需要建立對象再使用該方法。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Android基礎面試題