Overview 概述
Brew應用程序可以分為3類:激活的,掛起的和後台的 ;激活或掛起的應用程序駐留在應用程序棧裡,這個棧是brew用來管理正在執行 的應用的。棧中最上面(top)的是激活的應用程序,只有它才能直接與用戶通過屏 幕更換或者用戶事件來交互信息;掛起應用某種程度上位於當前激活應用的棧下 面 。
由於可能有多個應用處於掛起狀態,開發者應該盡量保證掛起程序 所占資源最小化。棧中的應用可以通過suspend 或resume 來掛起或激活應用。
在brew2.0版本中,涉及到了後台應用的開發。後台應用並不駐留在應用 程序棧中;也就是說,它不會依據掛起或激活事件而改變運行狀態。相反,後台 應用一旦被初始化運行後,總是一直在運行中,而不受用戶直接交戶指令影響。
Starting/Ending 啟動和結束
當開始初始化後台應用時,也像其 他正常的brew應用一樣;它可以直接由brew應用接口直接啟動,也可以通過其他 brew應用使用ISHELL_StartApplet函數來啟動。
要將一個brew應用放入後 台運行,brew應用在處理EVT_APP_STOP 事件時,必須將dwParam 的值設為false; 這樣在EVT_APP_STOP事件處理後,brew應用將被放在後台運行;後台應用要變為 brew正常使用,必須通過自我運行ishell_StartApplet函數來激活應用本身。
由前所述可知,要終止一個後台應用將會比較困難,因為他們不能直接接 受任何按鍵事件,因而,要結束一個後台應用就必須使用兩種思路:後台應用成 功執行完一個計劃任務後終止自己或者通過其他獨立的應用發送事件結束該後台 應用。具體使用方法有如下三種:
其他應用通過ISHELL_SendEvent或 ISHELL_PostEvent函數來發送事件(eCode 的值 大於evt_user)來通知後台應用 結束;
後台應用在執行完制定任務後,通過ISHELL_CloseApplet函數來終 止後台應用。根據api 的幫助說明,激活應用調用ISHELL_CloseApplet(pIShell, TRUE)該參數的函數後,將會關閉所有正在執行的程序並且回到待機界面。然而, 當由激活應用調用時,這個操作並不能影響到應用程序棧外面的程序;
應 用通過調用ISHELL_StartApplet函數來激活自身,從而可以正常接受用戶事件;
Suspend/Resume 掛起和恢復
由於後台應用駐留在應用程序棧的外 面,因而他們不受掛起和恢復時間的影響。後台應用只有被激活才能處理掛起和 恢復時間,它可以被自身或者其他程序發送的事件來激活。
Event Handling 事件處理
當後台應用正在運行時,它不能接受按鍵事件。然而 很多後台應用可以使用事件處理來和其他激活應用交互,這樣可以曲線控制後台 應用。在這種情況下,激活應用可以通過ISHELL_SendEvent()or ISHELL_PostEvent()方法來通知後台應用做出相應的反應。
Limitations 局限性
後台應用最主要的限制是除非自身激活,否則無法修改屏幕信息以 及和用戶直接交流。除此之外,開發者應該注重後台應用的運行環境的資源的有 限性。這對於後台極為重要,由於可能有多個後台在同時運行。並且,運行後台 應用的設備將需求更多的電源支持,有可能導致不能進入可信任模式;
因 而,長期的後台應用,應該避免對設備電池壽命的有害影響。一些OEM廠商可能會 限制後台運用的性能;例如:當運行後台運用時,它將不能使用socket或者不能 播放鈴音。
Examples 實例
Assume the following applet structure: //假設如下應用結構。
typedef struct _bgApp
{
AEEApplet a;
boolean m_bGoBg; // used to toggle whether to run in background mode ,後台運用的標志狀態。
} bgApp;
Model event handling for a background application: //後台運用的事件處 理模型
switch (eCode)
{
case EVT_APP_START:
if(pMe->m_bGoBg)
ISHELL_CloseApplet(pMe->a.m_pIShell, FALSE); // send applet to background
return TRUE;
case EVT_APP_STOP:
if(pMe->m_bGoBg)
*((boolean*) dwParam) = FALSE; // set dwParam to run in bg ,後台運行 了
return TRUE;
case EVT_USER:
if(pMe->m_bGoBg)
{
pMe->m_bGoBg = FALSE;
// make applet active,激活運用...
ISHELL_StartApplet(pMe->a.m_pIShell, AEECLSID_BGAPP); }
else
{
pMe->m_bGoBg = TRUE;
// trigger EVT_APP_STOP to send app to background
ISHELL_CloseApplet(pMe->a.m_pIShell, FALSE);
}
return TRUE;
}
應用程序可以通過evt_user 事件,可以將應用設置為後台應用或者激活應用 ;這些事件可以由其他應用通過ISHELL_SendEvent() 或者 ISHELL_PostEvent() 函數來發送。在這個執行處理中,evt_user事件只是將應用本身在後台和前台之 間作切換作用。更復雜的行為處理可以通過檢測dwParam參數的值進行處理,這個 值是由應用程序分發時間傳遞來的。如果應用程序直接由brew應用管理器啟動, m_bGoBg的初始化值將決定是否在後台運行