這種在Symbian C/S架構中,服務器程序與客戶UI進程主動通信中用的比較多。
對于在往UI框架應用程序發送消息,可以通過Symbian OS的Application Architecture Services可以進行應用程序間的通信,主要用到的類包括:TApaTaskList和TApaTask。
TApaTaskList:用于訪問設備中正在運行的任務(假如有些任務隱藏了的話,那么通過這種方法也無法進行訪問)。
TApaTask:表示設備中某個運行的任務,通過與程序關聯的窗口組(window group)標識。
具體的解決方案:
發送消息端:使用TApaTaskList找到等待接收消息的任務,TApaTaskList::FindApp()提供了兩個重載版本,可以使用程序的標題,也可以使用程序的UID進行查找。獲得需要發消息的任務后就可以通過TApaTask:: SendMessage()發送消息了,它有兩個參數,第一個參數用于標識消息,第二個參數是一個描述符的引用,可以用來提供不同消息時附加的具體信息。
TUid uid( TUid::Uid( 0x0116C9D3 ) );
TApaTaskList taskList( iCoeEnv->WsSession() );
TApaTask task = taskList.FindApp(uid );
if( task.Exists() ) //判斷任務是否正在運行
{
LIT8( KTestMsg, "CustomMessage" );
TUid msgUid( TUid::Uid( 1 ) );
task.SendMessage( uid, KTestMsg );
}
接收消息端可以使用如下兩種方案:
第一種方案:由于MCoeMessageObserver是處理來自窗口服務器消息的接口類,而CEikAppUi已經繼承自MCoeMessageObserver,所以我們只需要在自己的UI類中重現實現MCoeMessageObserver的唯一成員函數HandleMessageL()用來處理接收到的消息即可,代碼如下:
MCoeMessageObserver::TMessageResponse CXXXAppUi::HandleMessageL(TUint32 aClientHandleOfTargetWindowGroup, TUid aMessageUid, const TDesC8& aMessageParameters)
{
_LIT( KFormatStr, "%x" );
TBuf<32> bufUid;
TBuf<32> bufPara;
bufUid.AppendFormat( KFormatStr, aMessageUid.iUid );
bufPara.Copy( aMessageParameters );
iEikonEnv->InfoWinL( bufUid, bufPara );
return MCoeMessageObserver::EMessageHandled;
}
第二種方案:由于TApaTask::SendMessage()發送的消息可以被CEikAppUI的成員函數ProcessMessageL()攔截并處理,不過必須在沒有重載HandleMessageL()函數的前提下,而且函數ProcessMessageL()只負責攔截消息標識為KUidApaMessageSwitchOpenFileValue和KUidApaMessageSwitchCreateFileValue的這兩個消息,其它標識值的消息不會被傳到ProcessMessageL()中,所以這種方案個人覺得很受限制,不自由,還是采用第一種方案好,具體代碼代碼如下:
//發送:
TUid uid( TUid::Uid( 0x0116C9D3 ) );
TApaTaskList taskList( iCoeEnv->WsSession() );
TApaTask task = taskList.FindApp(uid );
if( task.Exists() ) //判斷任務是否正在運行
{
LIT8( KTestMsg, "CustomMessage" );
//這里的Uid不能使用自定義的,而且只有系統提供的兩個
TUid msgUid( TUid::Uid(KUidApaMessageSwitchCreateFileValue) );
task.SendMessage( uid, KTestMsg );
}
//接收:
void CXXXAppUi::ProcessMessageL(TUid aUid,const TDesC8& aParams)
{
RFileLogger iLog;
iLog.Connect();
iLog.CreateLog(_L("tb"), _L("UpdateListener2.txt"), EFileLoggingModeOverwrite);
iLog.Write(_L("smms appui"));
if (aUid.iUid == KUidApaMessageSwitchCreateFileValue)
{
TBuf<256> buf;
buf.Copy(aParams);
iLog.Write(aParams);
BringMeToFront();
ShowCreateFile(buf,CFileMonitorEngine::EImageType);
}
else
{
CAknViewAppUi::ProcessMessageL(aUid,aParams);
}
iLog.Close();
}
明天就是中秋了,恭祝大家中秋節快樂
posted on 2008-09-13 07:46
frank.sunny 閱讀(2065)
評論(1) 編輯 收藏 引用 所屬分類:
symbian 開發