您的位置:首页 > 产品设计 > UI/UE

Symbian上往UI框架应用程序发送消息

2010-09-03 12:07 405 查看
这种在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) );
<
4000
span>    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();
}

明天就是中秋了,恭祝大家中秋节快乐
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息