編輯:關於Android編程
在做android項目開發時,就不得不遇到一個Activity的狀態組件,這個組件描述的是一個控件、一個窗體等的當前狀態信息。下面詳細介紹這個組件
一、Activity狀態
Activity有三種狀態:active/running、paused、stopped。
1、active/running狀態,在當前屏幕時,即用戶可見的Activity,位於當前Task的棧頂。
2、paused狀態,Activity失去焦點但對用戶依然可見。也就是說在它上面有另外一個非全屏或者透明的Activity,並成為了當前的焦點。它還沒有被其他的Activity完全遮蓋住,而paused的Activity依然是alive狀態的,它保留著所有的狀態和成員信息並連接至窗口管理器,但當系統處於極低內存的情況下,仍然可以殺死這個Activity。
3、stopped 狀態,當Activity完全被另一個Activity覆蓋時,它仍然保留所有的狀態和成員信息。但它不再被用戶可見,所以它的窗口將被隱藏,當其它地方需要內存,則系統經常會殺死這個Activity。
當Activity是paused或者stopped狀態時,系統可以通過要求它結束(調用它的finish()方法)或直接殺死它的進程來將它驅出內存。當它再次為用戶可見的時候,它只能完全重新啟動並恢復至以前的狀態。
啟動並恢復至以前的狀態。
二、為什麼會有這麼麻煩的狀態變化
1、手機屏幕大小有限,只能看到有限的界面數量,用戶需要通過Back鍵或Home鍵或其他方式切換Activity。
2、在有手機來電時,系統會優先切換顯示電話接聽界面。
由於上述的一些原因,確實存在界面隨時可能發生切換的情況,最佳方式當然不是每次都直接銷毀之前的界面,很多時候我們也需要在回到之前界面後恢復之前的狀態。我們需要了解這些狀態,當然還包括要掌握Activity的“生命周期”等知識,這樣就能夠在Activity發生變化時,知其所以然,並能夠根據需求采取一定的措施,例如切換界面時,保存當前的界面信息,即使其被意外殺死也能恢復之前狀態。
三、Activity生命周期
當一個Activity從這個狀態轉變到另一個狀態時,它被以下列protected方法所通知:
public class Activity extends ApplicationContext { protected void onCreate(Bundle savedInstanceState); protected void onStart(); protected void onRestart(); protected void onResume(); protected void onPause(); protected void onStop(); protected void onDestroy(); }
protected void onSaveInstanceState (Bundle outState) protected void onRestoreInstanceState (Bundle savedInstanceState)
onPause()方法是在系統結束應用程序前調用的最後一個安全的方法。無法保證onStop和onDestroy會被調用,所以不能依賴這兩個方法來實現關鍵邏輯。
六、Activity的加載模式
Activity加載模式(通過在AndroidManifest.xml文件中activity元素的android:launcherMode屬性設置) 。請參考文章結尾附帶的demo體驗Activity的加載模式。
1、standard(默認)
測試方式:MainActivity(standard),SecondActivity(standard)
每次都是創建了新的Activity實例。
2、singleTop
測試方式:MainActivity(singTop),MainActivity自己intent自己
測試方式:MainActivity(singleTop),SecondActivity(standard)
和standard一樣是發送新的實例,但singleTop要求如果創建intent的時候棧頂已經有要創建的Activity實例,則將intent發送給該實例。例如給MainActivity設置singleTop,然後按鈕也是intent自己,那麼會發現一直都是MainActivity當前這個實例,因為他一直在棧頂,所以不會創建新的。
如果用A打開B,而B再打開A,如此循環,如果A是設置了singleTop,B是默認,則每次A都是新的,因為每次要打開A時,棧頂都不是A,就要創建新的A實例(和都是 standard沒啥區別了)。
此種模式的應用場景,目前想到就是為了解決自己在棧頂時,自己給自己發送intent可以不創建新的實例。實際中應用的也較少。
3、singleTask
測試方式:MainActivity(singleTask),SecondActivity(standard)
只創建一個實例。如果發現有對應的Activity實例,則是此Activity實例之上的其他Activity實例全部出棧,使此Activity實例成為棧頂對象,顯示出來。
4、singleInstance
這個模式下的Activity單獨在一個task棧中。這個棧只有一個Activity。目的是為了多個Task共享一個Activity。
七、Activity與View的生命周期
View和Activity一樣也有自己的生命周期,具體在View的周期中包含哪些通知函數,參見http://developer.android.com/reference/android/view/View.html。其中onMeasure、onLayout、onDraw最重要,而onMeasure最難理解(之後會單獨討論這個函數及其如何使用)。
八、Activity的注意事項
1、onConfigurationChanged
1)不設置Activity的android:conChanges時,切屏會重新調用各個生命周期,切橫屏時會執行一次,切豎屏時會執行兩次。
2)設置Activity的android:configChanges=”orientation”時,切屏還是會重新調用各個生命周期,切橫、豎屏時只會執行一次。
3)設置Activity的android:configChanges=”orientation|keyboardHidden”時,切屏不會重新調用各個生命周期,只會執行重寫的onConfigurationChanged方法。
在實際開發中,我們會因為生命周期的一些奇怪現象而接觸到這個函數。例如http://www.cnblogs.com/endure/p/3416736.html
本實例通過MediaPlayer播放一首音樂並通過AudioManager控制手機音頻,關於AudioManager的詳解可參照:Android開發之AudioManag
前面我們介紹了Android數據存儲的兩種方法:文件存儲和SharedPreference存儲,這一篇我們來學習一下Android存儲數據的另外一種方式—&m
項目中需要在應用從後台切換到前台時做操作,自己實現了功能,但對這塊的機制不太了解,So.找了相關的資料來學習總結下。!!!部分資料來源https://github.com
抽象工廠模式(Abstract Factory)抽象工廠模式是對象的創建模式,它是工廠方法模式的進一步延伸和拓展的結果。抽象工廠模式更加抽象化,更具一般性特點。我們知道,