這幾天在回顧Android的基礎知識,就把一些常見的知識點整理一下,以後忘了也可以翻出來看一看。
- 簡單介紹一下Activity的生命周期
在API文檔中對生命周期回調的函數描述的很詳細,這裡我只是翻譯了一下。
- onCreate:當Activity第一次被創建的時候調運。應該在這個回調函數中做所有的初始化操作,比如:創建View,給lists綁定數據等。在這個函數執行完後,通常會調運onStart方法。Always followed by onStart()(這句就不用翻譯了吧)
- onRestart:當Activity被stop後,有重新啟動的時候調運。Always followed by onStart()(這句就不用翻譯了吧)
- onStart:當Activity對用戶可見之前調運。當Activity要顯示到前台(對用戶可見)時,Followed by onResume();當Activity要隱藏時,Followed by onStop() 。
- onResume:當Activity開始用用戶交互的時候回調此方法。此時這個Activity在Activity棧的頂端。Always followed by onPause().
- onPause:當系統准備打開另一個Activity的時調用。此方法通常被用來保存當前的數據、停止動畫、一些消耗cpu的操作等。並且應該處理的很及時。
- onStop:當Activity對用戶不可見的時候調運。
- onDestroy:在Activity被銷毀之前調運。
Activity的這幾個生命周期函數是成對出現的:onCreate和onDestroy,onStart和onStop(Activity的View已被創建,但對用戶不可見),onResume和onPause(Activity對用戶仍然可見)。
- 如果Activity A正在運行,現在打開Activity B,Activity A、B的生命周期方法的執行順序是怎樣的?
在Android API中是這樣onPause方法的:
Called when the system is about to start resuming another activity.
它是說當系統准備打開另一個Activity的時候調用onPause方法。因此,此過程應該是這樣的:
通過運行程序,打印log,也可以驗證這個的結論,log截圖如下:
兩個Activity之間怎麼傳遞數據?
基本的數據可以通過Intent的putExtra()來傳遞,如果是其他數據類型,可以通過Intent的putExtras()來傳遞,此時改函數裡需要傳遞一個Bundle類型的數據,Bundle可以通過如下兩種方式來創建
Bundle bundle=new Bundle();
bundle.putSerializable("data",obj);
或者
Bundle bundle=new Bundle();
bundle.putParcelable("data",obj);
其中 obj分別需要繼承自Serializable或者Parcelable。這裡說一下Serializable和Parcelable是區別。Serializable是Java中的,它是將數據以二進制的形式寫入的文件中來保存的,需要時就從文件中讀取。而Parcelable是Android中獨有的,它是將數據寫入到內存中,用的時候直接從內存中度取,因此效率較高,但是Parcelable不能放較大的數據,因為這樣會導致OOM。
- 描述一下Service的生命周期、啟動方式及區別、如何停止Service?
在Service的生命周期中被調用的方法有:onCreate、onStart、onDestroy、onBind、onUnbind,顯然比Activity的少許多。
Service的啟動方式有兩種:
- 通過startService:
Service會經過onCreate,onStart,然後運行,在調用stopService時,會回調onDestroy方法,停止Service。如果此種情況下打開Service的Activity退出前不調運stopService,次Service會一直運行,直至被系統回收(當系統內存不夠時)。
- 通過bindService:
Service會經過onCreate,onBind,然後運行,在調用unBindService時,會回調onDestroy方法,停止Service。如果此種情況下打開的Service會和打開它的Activity綁定在一起,Activity銷毀,Service也被銷毀。
注:一個Service只會被創建一次,當它執行完onCreate方法後,調運再startService,只會執行onStart方法,調運再bindService,只會執行onBind方法。
被start的Service只能調運stopService來停止Service,被bind的Service只能調運unBindService來停止Service。同時調運了start、bind的Service則分別需要調運stopService、unBindService來停止Service。當然,由於系統內存不夠,Service被回收的情況例外。