編輯:關於Android編程
8.1 Activity
8.1.1 起源 8.1.2 Activity形態 8.1.3 生命周期 8.2 Activity任務棧簡介 8.3 ActivityManifest啟動模式
8.3.1 standard 8.3.2 singleTop 8.3.3 singleTask 8.3.4 singleInstance 8.4 Intent Flag啟動模式 8.5 清空任務棧 8.6 Activity任務棧使用
四大組件中出現頻率最高的組件
Activity是與用戶交互的第一接口,它提供了一個用戶完成指令的窗口,系統采用Activity棧的方式來管理Activity
Activity/Running
Activity處於Activity棧的最頂層,可見,並與用戶進行交互 Paused
當Activity失去焦點,被一個新的非全屏的Activity或者一個透明的Activity放置在棧頂時,Activity就轉換成了Paused形態,但它只是失去了與用戶交互的能力,所有狀態信息,成員變量都還保留著,只有在系統內存極地的情況下,才會被系統回收掉 Stopped
如果一個Activity被另一個Activity完全覆蓋,那麼Activity就會進入stop形態,此時他不再可見,但卻依然保持了所有狀態信息和成員變量 Killed
當Activity被系統回收或者Activity從來沒有創建過,Activity就處於Killed狀態
Google經典生命周期圖:
由於Android群英傳介紹的不詳細,我采用Android開發藝術探索這本書介紹生命周期:
onCreate:表示Activity正在被創建,這是生命周期的第一個方法,在這個方法可以做一些初始化工作,比如調用setContentView去加載界面布局資源、初始化Activity所需數據等 onRestart:表示Activity正在重新啟動,一般情況下,當當前Activity從不可見重新變為可見狀態時,onRestart就會被調用,這種情形一般是用戶行為所導致的,比如用戶按Home鍵切換到桌面或者用戶打開一個新的Activity,這是當前的Activity就會暫停,也就是onPause和onStop被執行了,接著用戶又回到了這個Activity,就會出現這種情況 onStart:表示Activity正在被啟動,即將開始,這時Activity已經可見了,但是還沒有出現在前台,還無法和用戶交互,這個時候其實可以理解為Activity已經顯示出來了,但是我們還看不到 onResume:表示Activity已經可見了,並且出現在前台並開始活動,要注意這個和onStart的對比,onStart和onResume都表示Activity已經可見,但是onStart的時候Activity還在後台,onResume的時候Activity才顯示在前台 onPause:表示Activity正在停止,正常情況下,緊接著onStop就會被調用,在特殊情況下,如果這個時候快速地再回到當前Activity,那麼onResume會被調用,筆者的理解是,這種情況屬於極端情況,用戶操作很難重現這一場景,此時可以做一些存儲數據、停止動畫等工作,但是注意不能太耗時,因為這會影響到新Activity顯示,onPause必須先執行完,新Activity的onResume才會執行 onStop:表示Activity即將停止,可以做一些稍微重量級的回收工作,同樣不能太耗時 onDestroy:表示Activity即將被銷毀,這是Activity生命周期最後一個回調,在這裡,我們可以做一些回收工作和最終的資源釋放
除生命周期外,還有Activity的狀態會保存起來:
如果你長時間處於stopped狀態而且此時系統需要更多內存或者系統內存極為緊張時,系統會回收你的Activity,而此時系統為了補償你,會將Activity狀態通過onSaveInstanceState()方法保存到Bundle對象中,當你需要重新創建這些Activity的時候,保存的Bundle對象就會傳遞到Activity的onRestoreInstanceState()方法與onCreate()方法中,即可調用該方法恢復被銷毀時的狀態
當一個App啟動時,如果當前環境下不存在該App的任務棧,那麼系統就會創建一個任務棧,此後,這個App所啟動的Activity都將在這個任務棧中被管理,這個棧也被稱為一個Task,即表示若干個Activity的集合,他們組成在一起形成一個Task,特別要注意的是,一個Task中的Activity可以來自不同的App,同一個App的Activity也可能不在一個Task中
棧的結構是後進先出的線性表,通過在AndroidManifest文件中的屬性android:launchMode來設置或者是通過Intent的flag來設置的
Manifest提供了四種啟動模式:
standard singleTop singleTask singleInstance對於這四種啟動模式可以簡單的在我另一篇博客理解一下:四種啟動模式
Intent.FLAG-ACTIVITY-NEW-TASK:使用一個新的Task來啟動一個Activity,但啟動的每個Aetivity都將在一個新的Task中,該Flag通常使用在從service中啟動的actiity場景,由於在Service中並不存在Activity棧,所以使用該Flag來創建一個新的Activity棧,並創建新的Activity實例 FLAG-ACTIVITY-SINGLE-TOP:使用singletop模式來啟動一個Activity,與指定android:launchMode=”singleTop”效果相同 FLAG-ACTIVITY-CLEAR-Top:使用SingleTask模式來啟動一個Activity,與指定android:launchMode=”singleTask”效果相同 FLAG-ACTIVITY-NO-HISTORY:使用這種模式啟動Acuvity,當該Activity啟動其他AcuVity後,該Activity就消失了,不會保留在Activity棧中,例如A-B,B中以這種模式啟動C,C再啟動D,則當前Activity棧為ABD
系統同樣提供了清空任務棧的方法讓我們將一個Task全部清除,通常可以在AndroidManifest的標簽中使用下面屬性來清理:
clearTaskOnLaunch:每次返回Activity的時候,都將該Activity上的所有Activity都清除,通過這個屬性,可以讓這個Task每次初始化的時候,都只有一個Activity finishTaskOnLaunch:這個屬性和clearTaskOnLaunch有點類似,只不過clearTaskOnLaunch作用在別人身上,而finishTaskOnLaunch作用在自己身上,通過這個屬性,當離開這個Activity所處的Task,那麼用戶再返回的時候,該Activity會被finish掉 alwaysRetainTaskState:Task的一道免死金牌,如果將Activity這個屬性設置為true,那麼該Activity所在的Task將不接受任何清除命令,一直保持當前Task的狀態
無知識點
一直在想起一個什麼題目好一些,題目只是最初的現實,經過不斷調試最後很是其它問題,想要起一個其它名字比如《打印機驅動中熱插拔事件中添加DEVTYPE》。但是最後想了想還是回
直接看代碼,注釋都寫清楚了復制代碼 代碼如下:public class MainActivity extends Activity { private Imag
現在大部分使用的都是SVN,也有一部分遷移了Git,雖然挺好的,不過還有其它很多版本控制的工具,並沒有誰最好用,最重要的是適合自己的公司與團隊,效率和團隊是成正比了,重要
配置Ubantu系統服務器,需要在“終端”輸入指定的命令來安裝指定的程序,進行對應的操作,類似於Windows中的命令行,因此在進行接下來的配置操