編輯:關於Android編程
之前筆者已經講過了LauchMode的作用,以及盡量避開棧的概念使用GIF圖片的方式盡可能簡單地闡述了一下Activity的啟動模式,這篇文章就再次深入,好好講一下在各種啟動模式下,Activity與任務棧到底是如何作用的。
任務棧:(筆者此處就復制一下官方文檔中的解釋)
當前 Activity 啟動另一個 Activity 時,該新 Activity 會被推送到堆棧頂部,成為焦點所在。 前一個 Activity 仍保留在堆棧中,但是處於停止狀態。Activity 停止時,系統會保持其用戶界面的當前狀態。 用戶按“返回”按鈕時,當前 Activity 會從堆棧頂部彈出(Activity 被銷毀),而前一個 Activity 恢復執行(恢復其 UI 的前一狀態)。 堆棧中的 Activity 永遠不會重新排列,僅推入和彈出堆棧:由當前 Activity 啟動時推入堆棧;用戶使用“返回”按鈕退出時彈出堆棧。 因此,返回棧以“後進先出”對象結構運行。 圖 1 通過時間線顯示 Activity 之間的進度以及每個時間點的當前返回棧,直觀呈現了這種行為。
圖 1. 顯示任務中的每個新 Activity 如何向返回棧添加項目。 用戶按“返回”按鈕時,當前 Activity 隨即被銷毀,而前一個 Activity 恢復執行。如果用戶繼續按“返回”,堆棧中的相應 Activity 就會彈出,以顯示前一個 Activity,直到用戶返回主屏幕為止(或者,返回任務開始時正在運行的任意 Activity)。 當所有 Activity 均從堆棧中刪除後,任務即不復存在。
四種啟動模式:
standard:標准模式,這也是系統的默認模式。
在這種模式下,誰啟動了這個Activity,那麼這個Activity就運行在啟動它的那個Activity所在的棧中。
例子:
1、Activity A在任務棧S1中,Activity B在任務棧S2中,那麼如果是A 啟動了標准模式的C,那麼C就會在S1棧中,如果是B啟動了C就會在S2棧中。
singleTop:棧頂復用模式。
這種模式算是standard的優化版。仍然是誰啟動了這個Activity,那麼這個Activity就運行在啟動它的那個Activity所在的棧中。不同點就是多了一個判斷。
例子:
1、目前S1棧內的情況是ABCD,此時再啟動ActivityD,如果啟動模式是standard,那麼棧內情況就是ABCDD。但是如果是singleTop模式,棧內情況就仍然還是ABCD。
注意:此處並不是把原來的D摧毀之後重新創建了一個D,而是直接把之前創建過的D拿過來用。
singleTask:棧內復用模式。
這種模式下,只要Activity在一個棧中存在,那麼多次啟動此Activity就不會重新創建實例,而是把之前創建過的實例拿過來用。但是如果不存在該Activity的實例,就會重新開啟一個棧,並把該Activity放入。
singleTask還默認具有clearTop的效果,會導致棧內所有在復用的Activity之上的Activity全部出棧。
例子:
1、當前S1任務棧中情況為ABC,此時啟動站內復用模式的Activity D,由於本來的棧中並不存在D,那麼此時就會新建一個任務棧S2,並且創建D的實例放入S2。
2、當前任務棧S1的情況為ADBC。
如果啟用標准模式的Activity D,那麼此時S1內的情況變為ADBCD。
而啟動站內復用模式的Activity D,根據棧內復用的原則,D不會重新創建,系統會把D重新切換到棧頂。原則上此時棧內情況應該變為ABCD,但是由於singleTask默認具有clearTop的效果,所以最終結果應該是AD。
singleInstance:單實例模式。
望文生義,即一個任務棧中只會存在一個單一的實例。當然也不僅僅如此,由於棧中只會存在一個實例,所以由這個實例打開的的任何一個Activity都會在單獨的任務棧中打開。
例子:
1、當前任務棧S1的情況是ABC(ABC啟動模式均為standard或者singleTop),此時啟動單實例的Activity D,就會新建一個任務棧S2並把D放入。從Activity D再次打開ABC中任何一個,就會新建一個S3的任務棧,並且把這個Activity放入。此時就會存在三個任務棧S1、S2、S3。
2、當前任務棧S1的情況是ABC(A的啟動模式為singleTask),此時啟動單實例的Activity D,就會新建一個任務棧S2並把D放入。此時從Activity D打開Activity A,會復用S1中的A。也就是說此時還是只有兩個任務棧S1和S2。但是還是遵從singleinstance“由這個實例打開的的任何一個Activity都會在單獨的任務棧中打開”的原則。
一、歷史回顧隨科技的迅速發展,當前已經全線進入4G時代,5G時代也即將開啟。Android版本迭代迅速,如今已是6.0的版本。時不時可以看到,手機危害了當前人群的生活,如
第一步:代碼混淆(注意引入的第三方jar)在新版本的ADT創建項目時,混碼的文件不再是proguard.cfg,而是project.properties和proguard
最近在做Android的項目,其中部分涉及到圖像處理的內容.這裡先講述如何調用Camera應用程序進行拍照,並截圖和保存顯示在ImageView控件中以及遇到的困難和解決
acitivyt 是什麼 引用官方的說法: 是一個應用組件,用戶可與其提供的屏幕進行交互,以執行撥打電話、拍攝照片、發送電子郵件或查看地圖等操作。 每個 Activity