basic4android 開發教程翻譯(五)Android進程及activitys 生存周期

來源:互聯網
上載者:User

簡而言之 :
每個 Basic4android 程式在它自己的進程中運行.
一個進程擁有一個主線程,這個主線程也叫做UI 線程,它會一直運行到進程結束.一個進程也可以有好幾個線程,這些線程用來做一些後台工作.

當使用者啟動一個應用時,一個進程就開始了工作, 假設其並沒有已經在後台運行.

進程的結束是不確定的. 有時可能發生在使用者或者系統關閉掉所有的activities後.
假設你有一個activity,當使用者按了返回鍵,這個activity被關閉了. 以後當電話的記憶體不夠時這個進程就會退出了(最後肯定會出現這種情況的).
如果使用者再次運行這個程式時,而這個進程並沒有被殺掉的話,這個進程就會被再次使用.

一個Basic4android應用是由一個或者多個activities組成. Android 支援其他幾個"main"元件.這些以後將在以後版本的Basic4android中加入.

Activities有點類似wondows 的表單.
主要的差別是當一個activity不在前台時,為了節省記憶體, 這個activity可能會被殺掉. 通常在activity消失前,你需要儲存它的狀態. 要麼儲存到一個持久的儲存上,要麼儲存到它的進程的記憶體裡.
以便以後當需要這個activity時,重建立立它.

另一個需要小心的地方是當裝置的主要配置發生變化時. 最常見情況是方向的變化(使用者旋轉了裝置). 當這些變化發生時,當前的activities會被銷毀和重建. 現在當我們建立activity時,我們可以根據新的配置來建立 (例如, 我們現在知道新的螢幕尺寸).
我們如何處理這些呢?
當你建立一個新的activity時,你可以使用下面的代碼模版:
Code:
Sub Process_Globals
'These global variables will be declared once when the application starts.
'These variables can be accessed from all modules.

End Sub

Sub Globals
'These global variables will be redeclared each time the activity is created.
'These variables can only be accessed from this module.

End Sub

Sub Activity_Create(FirstTime As Boolean)

End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub
變數可以是全域的和局部的. 局部變數是定義在子程裡面而不是定義在Process_Globals 和Globals裡.
局部變數被限制在本子程內. 子程一旦結束,這些變數就不再存在.
全域變數可以被所有的子程訪問.

有兩種類型的全域變數.
進程變數和activity變數.

進程變數 - 這些變數與進程的生存期一致.
你應該把把這些變數定義到sub Process_Globals裡面.
當進程開始時,這個子程被調用一次(不僅僅是第一個activitie,對所有的activities都一 樣).
這些變數應該僅僅是"公開"變數. 這意味著它們也可以被其它模組訪問.
然而,不是所有類型的對象都可以被定義為進程變數.
例如,所有的views不能被定義成進程變數.
主要原因是我們不想保留一個可能隨著activity銷毀而被銷毀的引用對象.
換句話說,一旦activity被銷毀了, activity上所有的views 也會同時被銷毀.
如果我們保留著一個view的引用,垃圾收集器就不能釋放這些資源,就會造成記憶體流失.
編譯器強制執行這個要求.

Activity變數 - 這些變數包含在activity中.
你應該在Sub Globals中定義這些變數.
這些變數是 "私人的"並且只能在當前activity模組中訪問.
所有的物件類型都可以被定義為activity變數.
每次activity建立時, Sub Globals就會被調用(在Activity_Create之前).
這些變數的生存期與這個activity一致.

Sub Activity_Create (FirstTime As Boolean)
當activity建立後,就會調用這個子程.
當使用者啟動應用時,activity就會被建立, 當裝置的配置發生變化時(使用者轉動裝置),這個activity就會被銷毀.另外,當這個activity 在後台時,為了釋放記憶體,OS 也可能會決定銷毀它.
這個子程應該用來載入或者建立layout (當然也可以做其他用處).
FirstTime 參數用來告訴我們是不是第一次建立這個activity. Firsttime相對於當前進程.
你可以使用FirstTime來完成有關進程變數的各種初始化工作.
例如,如果你需要讀一個含有一個列表的檔案,當FirstTime是True 的時候,你可以讀取這個檔案並將檔案中的列表儲存為進程變數.
現在我們就可以知道這個列表在整個進程的生存期會存在,而不需要每次activity建立後都重新讀取這個 列表.

總而言之, 你可以檢查FirstTime是否為True,然後初始化進程變數.

Sub Activity_Resume 和 Sub Activity_Pause (UserClosed As Boolean)
每次當activity從前台轉換到後台時就會調用 Activity_Pause子程.
當activity 在前台時,但是配置發生變化時 (這會導致activity暫停並被銷毀), 也會調用Activity_Pause子程.
Activity_Pause 是儲存重要訊息的最後的一個地方.
一般有兩種機制來讓你儲存activity狀態.
僅與當前應用有關的資訊可以被儲存到一個或多個進程變數中.
其他資訊應該儲存到持久儲存上(檔案或者是資料庫).
例如,如果使用者改變了一些設定,你應該在這裡把這些改變儲存到持久儲存上. 否則這些變化可能會丟失.

當Activity_Create完成後會立刻調用Activity_Resume.另外就是當繼續一個暫 停的activity也會調用它 (被切換到背景activity又被切換到前台).
注意:當你開啟一個不同的activity時 (通過調用 StartActivity),當前的進程首先被暫停,然後另外的activity將被建立(如果需要的話 ),然後當前進程會繼續執行(總是這樣).

通過以上討論, 每次當activity從前台切換到後台時Activity_Pause就會被調用. 這可能是以下原因造成的:
1. 啟動了一個不同的activity.
2. Home鍵被按了.
3. 配置改變事件被觸發(例如方向發生變化).
4. Backj鍵被按了.

在1和2的情況下, activity將會被暫停,並被儲存到記憶體中以便以後再次使用.
在3的情況下, activity將會被暫停,銷毀.然後再建立(並繼續).
在4的情況下, activity將會被暫停然後銷毀. 按Back鍵類似與關閉activity. 在這種情況下,你沒必要儲存任何執行個體特定的資訊(例如PacMan遊戲中的pacman的位置 ).
這中情況下,UserClosed 參數為true.其他情況下都是false. 請注意當你調用Activity.Finish時,它也是true. 這個方法暫停和銷毀當前activity,和Back鍵類似.

你可以使用UserClosed 參數來決定需要儲存那些資料和重設任何相關的進程變數為初始化值(如果位置是進程變數的話,移動pacma n的位置到中間).

處理UI狀態的一個新模組請參考這裡: http://www.basic4ppc.com/forum/basic...ngs-state.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.