
超詳細的Activity與Fragment的生命周期圖,可能大家會說你這篇文章也太水了吧。就這么一個破圖。可是我覺得它寫的很詳細,有些方法是哪些情況下會運行,哪些情況不會運行,寫的一清二楚。不知道大家能回答對多少。
強烈建議大家把圖片右鍵另存到本地,然后本地放大看??吹母宄?!

好了我們先來逐個看看Activity中一些平時不常用的函數(shù):
1. onPostCreate , onPostResume
onPostCreate是指onPostCreate方法是指onCreate方法徹底執(zhí)行完畢的回調(diào),onPostResume類似,那我們什么時候在可以使用這個呢。大家肯定遇到這種情況,在onCreate中獲取某個View的高度和寬度,發(fā)現(xiàn)獲取到的值是0,因為這個View可能還沒初始化好,這時候比如我們在onPostResume中取獲取這個View的高和寬,因為onPostResume是指onResume徹底執(zhí)行完畢的回調(diào),所以這時候去獲取就可以了。
2.onUserInteraction ,onUserLeaveHint
我們先來看onUserInteraction:
/**
* Called whenever a key, touch, or trackball event is dispatched to the
* activity. Implement this method if you wish to know that the user has
* interacted with the device in some way while your activity is running.
*
* <p>All calls to your activity's {@link #onUserLeaveHint} callback will
* be accompanied by calls to {@link #onUserInteraction}.
*
* activity無論分發(fā)按鍵事件、觸摸事件或者軌跡球事件都會調(diào)用Activity#onUserInteraction()。
* 如果你想知道用戶用某種方式和你正在運行的activity交互,可以重寫Activity#onUserInteraction()。
* 所有調(diào)用Activity#onUserLeaveHint()的回調(diào)都會首先回調(diào)Activity#onUserInteraction()。
*/
activity在分發(fā)各種事件的時候會調(diào)用該方法,注意:啟動另一個activity,Activity#onUserInteraction()會被調(diào)用兩次,一次是activity捕獲到事件,另一次是調(diào)用Activity#onUserLeaveHint()之前會調(diào)用Activity#onUserInteraction()。
那一定有人會問這個方法我們有什么用處呢。我們看到我們可以用這個方法來監(jiān)控用戶有沒有與當(dāng)前的Activity進行交互,那我們就可以針對這個來假設(shè)場景,有個APP要求N分鐘后用戶沒有進行操作,那就自動出來動態(tài)壁紙,或者進行鎖屏界面,或者跳到登錄界面重新登錄等!那我們只需要寫個倒計時,然后每次調(diào)用了onUserInteraction方法,就把時間重置即可。。多方便!!
我們再看onUserLeaveHint:
/**
* Called as part of the activity lifecycle when an activity is about to go into the background as the result of user choice.
* For example, when the user presses the Home key, {@link #onUserLeaveHint} will be called, but
* when an incoming phone call causes the in-call Activity to be automatically brought to the foreground,
*{@link #onUserLeaveHint} will not be called on the activity being interrupted.
*
* 當(dāng)用戶的操作使一個activity準(zhǔn)備進入后臺時,此方法會像activity的生命周期的一部分被調(diào)用。例如,當(dāng)用戶按下Home鍵,
* Activity#onUserLeaveHint()將會被回調(diào)。但是當(dāng)來電導(dǎo)致來電activity自動占據(jù)前臺,Activity#onUserLeaveHint()將不會被回調(diào)。
*/
用戶手動離開當(dāng)前activity,會調(diào)用該方法,比如用戶主動切換任務(wù),短按home進入桌面等。系統(tǒng)自動切換activity不會調(diào)用此方法,如來電,滅屏等。
我們一般監(jiān)聽返回鍵,肯定是重寫onKeyDown方法,但是Home鍵和Menu鍵就不好監(jiān)聽了。但是有了這個方法。我們可以做統(tǒng)一的監(jiān)聽了。比如要監(jiān)聽用戶點了Home鍵跳回到桌面后。我們要求這個APP自動跳轉(zhuǎn)到解鎖界面。我們只要在這里做監(jiān)聽出來即可。
3. onContentChanged
onContentChanged()是Activity中的一個回調(diào)方法,當(dāng)Activity的布局改動時,即setContentView()或者addContentView()方法執(zhí)行完畢時就會調(diào)用該方法。那我們可以用來干嘛呢。比如我們平時寫的findViewById方法,也可以統(tǒng)一放到這個方法下:
@Override
public void onContentChanged() {
super.onContentChanged();
mGalleryButton = (Button) findViewById( R.id.button1 );
mEditButton = (Button) findViewById( R.id.button2 );
}
4. onAttachedToWindow
onAttachedToWindow是在第一次onDraw前調(diào)用的。也就是我們寫的View在沒有繪制出來時調(diào)用的,但只會調(diào)用一次。
比如,我們寫狀態(tài)欄中的時鐘的View,在onAttachedToWindow這方法中做初始化工作,比如注冊一些廣播等等……
而且如果要修改window窗口的尺寸,不會在onCreate方法中進行修改,而是在onAttachedToWindow方法中進行修改。
在Android4.0前面,如果想屏蔽Home鍵事件,還可以在onAttachedToWindow這么寫:
@Override
public void onAttachedToWindow() {
// TODO Auto-generated method stub
this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
super.onAttachedToWindow();
}
只是現(xiàn)在在Android4.0后面這樣已經(jīng)無效了,會報錯:
java.lang.IllegalArgumentException: Window type can not be changed after the window is added.