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 backgroundreturn 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 backgroundISHELL_CloseApplet(pMe->a.m_pIShell, FALSE); }return TRUE;}
應用程式可以通過evt_user 事件,可以將應用設定為後台應用或者啟用應用;這些事件可以由其他應用通過ISHELL_SendEvent() 或者 ISHELL_PostEvent()函數來發送。在這個執行處理中,evt_user事件只是將應用本身在後台和前台之間作切換作用。更複雜的行為處理可以通過檢測dwParam參數的值進行處理,這個值是由應用程式分發時間傳遞來的。如果應用程式直接由brew應用管理器啟動,m_bGoBg的初始化值將決定是否在後台運行。