簡而言之 :
每個 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