⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 《深入brew开发》——第六章 使用applet和模块 - gemsea的专栏 - csdnblog.htm

📁 《深入BREW开发》——第六章 使用Applet和模块
💻 HTM
📖 第 1 页 / 共 4 页
字号:
      </SPAN>下面的表格中包含了有效和无效的MIF文件名的事例:</DIV>
      <TABLE 
      style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" 
      cellSpacing=0 cellPadding=0 border=1>
        <TBODY>
        <TR>
          <TD 
          style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 142pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" 
          vAlign=top width=189>
            <DIV>有效MIF文件名</DIV></TD>
          <TD 
          style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 142.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" 
          vAlign=top width=189>
            <DIV>无效MIF文件名</DIV></TD>
          <TD 
          style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 142.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" 
          vAlign=top width=189>
            <DIV>无效原因</DIV></TD></TR>
        <TR>
          <TD 
          style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 142pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" 
          vAlign=top width=189>
            <DIV>abc.mif</DIV></TD>
          <TD 
          style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 142.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" 
          vAlign=top width=189>
            <DIV>Abc.mif</DIV></TD>
          <TD 
          style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 142.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" 
          vAlign=top width=189>
            <DIV>文件名中使用了大写字母</DIV></TD></TR>
        <TR>
          <TD 
          style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 142pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" 
          vAlign=top width=189>
            <DIV>a2c.mif</DIV></TD>
          <TD 
          style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 142.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" 
          vAlign=top width=189>
            <DIV>123.mif</DIV></TD>
          <TD 
          style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 142.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" 
          vAlign=top width=189>
            <DIV>全数字文件名</DIV></TD></TR>
        <TR>
          <TD 
          style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 142pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" 
          vAlign=top width=189>
            <DIV>a23.mif</DIV></TD>
          <TD 
          style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 142.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" 
          vAlign=top width=189>
            <DIV>1ab.mif</DIV></TD>
          <TD 
          style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 142.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" 
          vAlign=top width=189>
            <DIV>第一个不是字母</DIV></TD></TR></TBODY></TABLE>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      </SPAN>不能够使用大写字母的原因是,在BREW平台上,规定了文件名不支持大小写混合。不过在当前BREW3.x的模拟器上,检测到大小写混合的文件名的时候,只是显示一个警告对话框,但是应用程序是可以在模拟其中运行的。但这不能够保证在实际的BREW设备中也可以运行,因此我们禁止这样的命名方法。</DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      </SPAN>对于首字母是数字或全部数字命名的MIF文件名,是BREW在从ADS服务器上下载应用程序是自动替换和命名的,因此是保留的命名方式。而且BREW对待全数字命名的应用程序有特殊的方式,因此,如果在开发过程或发布过程中使用这种方式命名的MIF文件,可能导致我们的应用程序发生致命的错误。因此,我们应当禁止这种做法。</DIV>
      <DIV><STRONG><FONT size=4><A name=_Toc137296214>6.2 BREW</A><SPAN>的Class 
      ID</SPAN></FONT></STRONG></DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      </SPAN>在BREW平台中,每一个接口类或Applet都必须有一个唯一的Class ID。BREW应用程序开发者可以通过高通网站的<A 
      href="https://brewx.qualcomm.com/classid/home.jsp">https://brewx.qualcomm.com/classid/home.jsp</A>页面获得这些Class 
      ID。不过,只有注册的授权用户,同时交纳了Class 
      ID的购买费用之后才可以申请。如果您当前正在开发应用程序,并且还没有注册成为授权用户,您可以使用临时的Class 
      ID进行开发。如果我们手动的为我们的应用程序分配Class ID,那么我们必须保证它们是唯一的。如果有两个或两个以上的接口Class 
      ID或Applet Class ID是一样的,那么这些接口和Applet将有可能不能运行。例如,考虑下面的目录结构:</DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; abc.mif</SPAN></DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test.mif</SPAN></DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test\test.dll</SPAN></DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      </SPAN>如果abc.mif和test.mif使用了同样的Class ID,那么test 
      Applet将不能正确地运行。因为,BREW是按照文件名的顺序枚举MIF文件的,因此,对于指定的Class 
      ID,abc.mif会首先被载入。所以,当我们试图启动test应用程序的时候,可能会启动abc这个应用程序,或者什么应用程序也启动不了(如果abc.mif中仅仅输入了接口类的话)。</DIV>
      <DIV><STRONG><FONT size=4><A name=_Toc137296215>6.3 
      </A><SPAN>创建一个接口的实例</SPAN></FONT></STRONG></DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      </SPAN>在一个模块或Applet中可以使用任何一个BREW的接口,不过在使用这些接口方法之前,需要先创建接口的实例,也就是获得接口的指针。BREW创建一个接口实例的方法是通过调用ISHELL_CreateInstance(IShell 
      * pIShell, AEECLSID cls, void * * 
      ppobj)成员函数,这是一个在BREW中十分有用的API接口函数。在调用这个函数的时候,需要指定创建接口的Class 
      ID,以及接收接口指针数据的接口指针,这个接口指针通过**ppobj的二重指针传入。在这个成员函数执行的时候,BREW会根据指定的Class 
      ID搜索支持类的列表,这个列表由两部分组成:一种是内嵌在BREW平台中的接口,如BREW的标准接口;另一种是系统启动时枚举的MIF文件中支持的类。BREW中调用ISHELL_CreateInstance成员函数的具体执行内容如下:</DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1</SPAN>、查找支持当前类的模块</DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      2</SPAN>、将这个模块载入内存(如果当前没有载入的话)</DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      3</SPAN>、调用IMOUDULE_CreateInstance()成员函数创建接口实例</DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      </SPAN>如果成功创建了这个类的实例,那么,将会通过参数ppobj返回这个接口实例的指针。在这个接口的使用者不再需要这个接口的时候,必须调用该类的Release方法释放接口实例,同时将接口指针置空。在编写BREW应用程序的时候,创建实例的应用程序一定要负责释放这个实例。</DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      </SPAN>所有的BREW类都是从IBase继承而来的。IBase接口中有两个方法,IBASE_AddRef和IBASE_Release,由于全部的类都是从IBase继承而来,那么,全部BREW类都支持AddRef和Release方法。这两个方法是用来控制接口实例引用计数的。引用计数也就是指当前的类实例有多少个指针指向它(也就是引用它)。当增加一个引用的时候,必须调用AddRef方法增加类实例内部的引用计数,当释放一个引用的时候必须调用Release方法减少引用计数。当内部引用计数为0的时候,就会释放这个类的实例。我们必须严格的遵守这个规则,否则将不能够正确地释放接口实例所占用的系统资源,如内存等,会引起系统资源的耗尽,从而导致系统崩溃。</DIV>
      <DIV><STRONG><FONT size=4><A name=_Toc137296216>6.4 
      </A><SPAN>创建和终止一个Applet</SPAN></FONT></STRONG></DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      </SPAN>在BREW模式下,Applet是一个支持IApplet接口的类。这使得BREW可以通过一个简单的接口控制所有的Applet。除了标准的AddRef和Release方法外,IApplet接口还支持HandleEvent方法。</DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      BREW</SPAN>可以通过两种方式创建一个Applet:</DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      1</SPAN>、直接调用ISHELL_StartApplet(IShell * pIShell, AEECLSID 
      cls)成员函数。这个成员函数允许创建Applet并同时通过IApplet的HandleEvent方法发送EVT_APP_START事件。EVT_APP_START事件告知BREW 
      Applet现在已经处于激活状态,同时可以刷新屏幕了。</DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      2</SPAN>、注册通知或闹钟事件。在这种情况下,将立刻创建Applet并接收指定的通知事件。如果Applet需要刷新屏幕或接收按键输入时,可以通过调用ISHELL_StartApplet来启动自身。</DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      </SPAN>如果需要终止当前激活的Applet,可以调用ISHELL_CloseApplet(IShell * pIShell, boolean 
      bReturnToIdle)成员函数。调用此方法时,将会终止当前处于激活状态的Applet,同时发送EVT_APP_STOP事件告知Applet:应用程序将被关闭,请释放相关资源。</DIV>
      <DIV><STRONG><FONT size=4><A name=_Toc137296217>6.5 
      </A><SPAN>处理Applet</SPAN><SPAN>的事件</SPAN></FONT></STRONG></DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>当一个BREW 
      Applet正在运行的时候(出于激活状态),它将通过HandleEvent函数接收事件。这些事件包括键盘、对话框和控件更改事件。下面是一个Applet的示例事件流程:</DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EVT_APP_START</SPAN></DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; …</SPAN></DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      </SPAN>其他BREW事件(EVT_KEY等)</DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; …</SPAN></DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      EVT_APP_SUSPEND</SPAN>(可选)</DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      EVT_APP_RESUME</SPAN>(可选)</DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; …</SPAN></DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      </SPAN>其他BREW事件(EVT_KEY等)</DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; …</SPAN></DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EVT_APP_STOP</SPAN></DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      </SPAN>通常情况下,一个Applet值需要处理几种事件就可以了,包括EVT_APP_START、EVT_APP_STOP、EVT_KEY和EVT_COMMAND。如果在我们的Applet中没有处理一个事件的话,我们应该在应用程序的HandleEvent函数中返回FALSE。这将让BREW采用默认的方式处理这个事件。任何一个BREW 
      Applet的核心函数都是HandleEvent,因为BREW基于事件驱动的机制就是通过这个函数体现出来的,它是BREW 
      Applet的一个事件入口。Applet的运行也是通过这个函数接收事件而运转的。</DIV>
      <DIV><STRONG><FONT size=4><A name=_Toc137296218>6.6 
      </A><SPAN>挂起和恢复Applet</SPAN></FONT></STRONG></DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      </SPAN>在BREW环境下,同一时刻仅能有一个激活的、顶层可见的Applet。但是,在同一时刻可以有多个Applet处于运行状态。这个顶层可见的意思是这个Applet控制着主显示屏以及接收键盘事件。除了这个顶层可见的应用程序外,其他处于运行状态的应用程序统统处于一个叫做挂起(Suspend)的状态。处于挂起状态的Applet除了主屏显示和接收键盘事件外,其他的操作都可以正常进行。如果需要将处于挂起状态的应用程序激活,处于顶层可见,那么需要调用ISHELL_StartApplet函数,或通过调用ISHELL_CloseApplet函数关闭当前活动的Applet直到需要激活的应用程序为止。</DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      </SPAN>当App1处于顶层可见时,如果App2通过调用ISHELL_StartApplet变为顶层可见,那么,App1将被挂起。当App2关闭时,App1被恢复。挂起和恢复是BREW描述一个Applet是否具有主显示屏和键盘事件控制权的一个机制。</DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      </SPAN>当BREW挂起一个Applet的时候,会向这个Applet发送EVT_APP_SUSPEND事件。如果这个Applet将这个事件的处理结果返回TRUE,则表示告知BREW已经处理了挂起事件,但是,此时的Applet不会从内存中卸载。如果当前Applet不希望处理挂起事件,它可以返回FALSE,这样,BREW将会终止当前的应用程序,并发送EVT_APP_STOP事件,同时在内存中卸载这个应用程序。任何在EVT_APP_START事件中分配的内存,都应改在EVT_APP_STOP事件中释放。任何在AEEClsCreateInstance()函数中分配的内存,需要在应用程序的APPFreeData()函数中释放。如果在内存是在AEEClsCreateInstance()中分配的话,那么在EVT_APP_STOP事件中释放将会是十分危险的。举个例子,如果在EVT_APP_START事件处理中返回了FALSE,那么EVT_APP_STOP事件将不再发送,这样就导致了内存泄露。</DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      </SPAN>在模拟器中,可以通过选区菜单的方式来模拟EVT_APP_SUSPEND事件的发送。例如,选取菜单“工具-〉设置”,则模拟器会向当前的应用程序发送EVT_APP_SUSPEND事件,在关闭这个设置对话框之后,会发送EVT_APP_RESUME事件。</DIV>
      <DIV><STRONG><FONT size=4><A name=_Toc137296219>6.7 
      </A><SPAN>应用程序堆栈和IAppHistory</SPAN><SPAN>接口</SPAN></FONT></STRONG></DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      BREW</SPAN>允许有多个Applet同时运行,但是只有一个Applet是激活的。这个时候就牵扯到了BREW 
      Applet管理的问题,这就是BREW应用程序堆栈。通过应用程序的堆栈我们可以:</DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      1</SPAN>、在应用程序历史数据中,允许一个应用程序出现多次</DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      2</SPAN>、即便应用程序处于背景运行装台下(Suspend),也可以使应用程序出现在应用程序历史数据中。</DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      BREW</SPAN>通过IAppHistory接口管理应用程序的历史数据列表,同时允许一个应用程序在堆栈中存在多个历史数据条目。例如,在当前的BREW历史数据中,可以存在如下的应用程序条目序列:</DIV>
      <DIV style="TEXT-INDENT: 21pt">App A -&gt; App B -&gt; App C -&gt; App A 
      -&gt; App B</DIV>
      <DIV style="TEXT-INDENT: 21pt">此时应用程序A和B都在历史列表中有两个条目。此时App B处于激活状态,如果关闭App 
      B,那么,上面的序列将变成下面这样:</DIV>
      <DIV style="TEXT-INDENT: 21pt">App A -&gt; App B -&gt; App C -&gt; App 
      A</DIV>
      <DIV 
      style="TEXT-INDENT: 21pt">这样的处理方式可以使得整个的应用程序序列按原样返回。并不是每一个应用程序每次启动时都会增加历史数据,但是可以保证的是当前每一个正在运行的应用程序都会有历史数据,无论它是处于激活或挂起状态。如果当前使用ISHELL_StartApplet启动的应用程序,没有一个相关的历史数据条目相对应的话,则BREW会在历史数据列表中增加条目。</DIV>
      <DIV 
      style="TEXT-INDENT: 21pt">如果历史列表中该应用程序相关的历史数据已经存在的话,是增加新的历史数据条目,还是仅仅改变当前历史数据的顺序,将遵循如下的规则:</DIV>
      <DIV 
      style="TEXT-INDENT: 21pt">1、如果这个应用程序已经在前面挂起的过程中,通过调用IAPPHISTORY_SetResumeData()设置了恢复数据的话,那么,将会在历史数据列表中新增历史数据条目。此时就是同一个应用程序对应多个历史数据条目的情况。</DIV>
      <DIV 
      style="TEXT-INDENT: 21pt">2、如果这个应用程序已经在前面挂起的过程中,没有调用IAPPHISTORY_SetResumeData()设置恢复数据,那么,将不增加历史数据条目,而只是改变已有历史数据的顺序。由于在BREW3.0版本之前,BREW并没有提供IAppHistory接口,因此这些版本全部采用的是这种处理方式。</DIV>
      <DIV 
      style="TEXT-INDENT: 21pt">在使用非IAppHistory接口的方式关闭应用程序的时候,将会删除与全部已关闭应用程序的历史数据条目。使用IAPPHISTORY_Stop()关闭一个应用程序的时候,不会从应用程序堆栈中移除历史数据,除非这个应用程序处于激活状态。</DIV>
      <DIV 
      style="TEXT-INDENT: 21pt">BREW的IAppHistory接口提供给我们控制BREW应用程序的高级方法,使得我们对BREW应用程序的控制能力进一步加强了(BREW3.0之前的版本是没有这个接口的)。例如,当系统的内存不足时,我们可以通过使用IAPPHISTORY_Stop()方法卸载在内存中的应用程序,而不影响当前的应用程序堆栈。</DIV>
      <DIV><STRONG><FONT size=4><A name=_Toc137296220>6.8 
      </A><SPAN>创建自定义通知</SPAN></FONT></STRONG></DIV>
      <DIV><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      </SPAN>通知事件是BREW提供的一种常用的高级功能。通过这个通知机制,我们可以接收到来自网络、闹钟等模块的事件,而不必采用轮询的方式进行监测,这大大提高了程序的效率。最常见的几种通知类型是通话、短信息、闹钟(闹钟使用的是EVT_ALARM事件,但它与通知事件原理相同)事件。一个应用程序如果要获得这样的通知事件,需要使用ISHELL_RegisterNotify()函数进行事件注册。注册后,当事件产生的条件满足时,BREW将发送EVT_NOTIFY事件给注册的应用程序。不管这个应用程序是否处于激活状态,都能够接收到这个事件。</DIV>
      <DIV style="TEXT-INDENT: 21pt">除了BREW系统的通知事件以外,我们还可以创建自己的通知类。基本步骤如下:</DIV>
      <DIV 
      style="TEXT-INDENT: 21pt">1、编写一个从INotifier接口继承而来的BREW接口类(非Applet),同时实现INotifier接口成员函数。</DIV>
      <DIV style="TEXT-INDENT: 21pt">2、定义接口类所需的通知掩码。</DIV>
      <DIV style="TEXT-INDENT: 21pt">3、实现这个新的接口类。</DIV>
      <DIV 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -