這種在Symbian C/S架構(gòu)中,服務(wù)器程序與客戶UI進(jìn)程主動(dòng)通信中用的比較多。
對(duì)于在往UI框架應(yīng)用程序發(fā)送消息,可以通過Symbian OS的Application Architecture Services可以進(jìn)行應(yīng)用程序間的通信,主要用到的類包括:TApaTaskList和TApaTask。
TApaTaskList:用于訪問設(shè)備中正在運(yùn)行的任務(wù)(假如有些任務(wù)隱藏了的話,那么通過這種方法也無法進(jìn)行訪問)。
TApaTask:表示設(shè)備中某個(gè)運(yùn)行的任務(wù),通過與程序關(guān)聯(lián)的窗口組(window group)標(biāo)識(shí)。
具體的解決方案:
發(fā)送消息端:使用TApaTaskList找到等待接收消息的任務(wù),TApaTaskList::FindApp()提供了兩個(gè)重載版本,可以使用程序的標(biāo)題,也可以使用程序的UID進(jìn)行查找。獲得需要發(fā)消息的任務(wù)后就可以通過TApaTask:: SendMessage()發(fā)送消息了,它有兩個(gè)參數(shù),第一個(gè)參數(shù)用于標(biāo)識(shí)消息,第二個(gè)參數(shù)是一個(gè)描述符的引用,可以用來提供不同消息時(shí)附加的具體信息。
TUid uid( TUid::Uid( 0x0116C9D3 ) );
TApaTaskList taskList( iCoeEnv->WsSession() );
TApaTask task = taskList.FindApp(uid );
if( task.Exists() ) //判斷任務(wù)是否正在運(yùn)行
{
LIT8( KTestMsg, "CustomMessage" );
TUid msgUid( TUid::Uid( 1 ) );
task.SendMessage( uid, KTestMsg );
}
接收消息端可以使用如下兩種方案:
第一種方案:由于MCoeMessageObserver是處理來自窗口服務(wù)器消息的接口類,而CEikAppUi已經(jīng)繼承自MCoeMessageObserver,所以我們只需要在自己的UI類中重現(xiàn)實(shí)現(xiàn)MCoeMessageObserver的唯一成員函數(shù)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()發(fā)送的消息可以被CEikAppUI的成員函數(shù)ProcessMessageL()攔截并處理,不過必須在沒有重載HandleMessageL()函數(shù)的前提下,而且函數(shù)ProcessMessageL()只負(fù)責(zé)攔截消息標(biāo)識(shí)為KUidApaMessageSwitchOpenFileValue和KUidApaMessageSwitchCreateFileValue的這兩個(gè)消息,其它標(biāo)識(shí)值的消息不會(huì)被傳到ProcessMessageL()中,所以這種方案個(gè)人覺得很受限制,不自由,還是采用第一種方案好,具體代碼代碼如下:
//發(fā)送:
TUid uid( TUid::Uid( 0x0116C9D3 ) );
TApaTaskList taskList( iCoeEnv->WsSession() );
TApaTask task = taskList.FindApp(uid );
if( task.Exists() ) //判斷任務(wù)是否正在運(yùn)行
{
LIT8( KTestMsg, "CustomMessage" );
//這里的Uid不能使用自定義的,而且只有系統(tǒng)提供的兩個(gè)
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();
}
明天就是中秋了,恭祝大家中秋節(jié)快樂
posted on 2008-09-13 07:46
frank.sunny 閱讀(2065)
評(píng)論(1) 編輯 收藏 引用 所屬分類:
symbian 開發(fā)