編輯:關於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自動變量,即動態局部變量,屬於動態存儲類別,占動態存儲空間,函數調用結束後即釋放)。靜態變量雖在程序的整個執行過程中始終存在,但是在它作用域之外不能使用。
靜態變量並不是說其就不能改變值,不能改變值的量叫常量。 其擁有的值是可變的 ,而且它會保持最新的值。說其靜態,是因為它不會隨著函數的調用和退出而發生變化。即上次調用函數的時候,如果我們給靜態變量賦予某個值的話,下次函數調用時,這個值保持不變。
靜態方法是使用公共內存空間的,就是說所有對象都可以直接引用,不需要創建對象再使用該方法。
首先,讓我們確認下什麼是service? service就是android系統中的服務
主界面的實現 前面已做好了核心布局文件,接下來要做的就是讓客戶端活起來,現在的任務就是實現一個側滑菜單的功能,實現這個功能也並不難,使用V4包下的DrawerLayout
之前在一篇文章中已經講過了菜單項的創建方法,但是那種方法效率較低,維護不易,現在實現另一種方法創建菜單。MenuInflater,通過此類我們可以輕松的創建菜單項,具體步
TabLayout是Android 的Material Design包中的一個控件,可以和V4包中的ViewPager搭配產生一個聯動的效果。這裡我自定義了一