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

本文介绍在Symbian C/S架构下,如何实现服务器程序与客户端UI进程之间的主动通信。主要通过TApaTaskList和TApaTask类完成跨应用的消息传递,并提供了发送与接收消息的两种实现方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



这种在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();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值