| 操作系统 办公 实用知识 设计 开发 WEB开发 移动开发 数据库 软件工程 网管 安全 管理 信息化 答疑 渠道 |
中止和恢复应用程序下面几个例子说明可能会引起应用程序中止的情况: 电池电量不足警告 进入的电话呼叫 进入的非 BREW™ SMS 消息 激活键盘锁定 OEM 需显示消息,如 Entering Service(输入服务) 需要运行 BREW 内核应用程序(例如,要将未完成确认发送到应用程序下载服务器时,就需要运行 BREW 内核应用程序 - BREW 内核应用程序将在发送确认消息的同时,启动并显示 Preparing Applications(准备应用程序)) 要演示中止/恢复期间会发生的情况,我们可以看一看 BREW 应用程序运行时接收到进入呼叫的示例。 BREW 将 EVT_APP_SUSPEND 事件发送到正在运行的应用程序。 当且仅当该应用程序不处理 EVT_APP_SUSPEND(即返回 FALSE)时,BREW 才将 EVT_APP_STOP 发送到该应用程序。 呼叫结束时,BREW 将 EVT_APP_RESUME 或 EVT_APP_START 发送到该应用程序,取决于以前是否处理过 EVT_APP_SUSPEND。 即 EVT_APP_SUSPEND 和 EVT_APP_RESUME 对称,而事件 EVT_APP_STOP 和 EVT_APP_START 对称。 请注意:由于每个运营商对于在应用程序中止/恢复时应用程序应该做什么和不做什么有不同的指导原则,建议参考运营商指导原则。 下面是应用程序在中止和恢复时应该执行的操作的列表(如果应用程序希望在中止后恢复)。 请注意此列表并不详尽,但可以用作应用程序中止/恢复时所需某些通用处理的检查清单。 应用程序中止时应执行以下操作: 将控件(IMenuCtl、ITextCtl、IDateCtl 和 ITimeCtl)设置为未激活。 IMENUCTL_SetActive (pMe->m_pIMenu, FALSE); 重置 IStatic 控件。 带文本内容的 IStatic: 重置带文本内容的 IStatic 控件的示例: if (pMe->m_pIStatic != NULL) ISTATIC_Reset (pMe->m_pIStatic); 带动画位图内容的 IStatic: ISTATIC_Reset (pMe->m_pIStatic); 明确停止 IImage。 由于已停止且不释放 IImage,所以恢复时不需要重新实例化。 IIMAGE_Stop(pMe->m_pIImage); 如果涉及内存(如当前小程序被中止时会启动另一个小程序的情况),则建议释放 IStatic 和相关 IImage(如果有)。 释放 IStatic 和 IImage 将从内存中将它们完全删除,因此在恢复时要求重新实例化。 释放 IStatic 控件的示例: if (pMe->m_pIStatic != NULL) { ISTATIC_Release (pMe->m_pIStatic); pMe->m_pIStatic = NULL; } 停止 IImage 动画 IIMAGE_Stop(pMe->m_pIImage);取消计时器 if (ISHELL_GetTimerExpiration (pMe->m_pIShell, TimerCB, (void *)pMe) > 0) ISHELL_CancelTimer (pMe->m_pIShell, TimerCB, (void *)pMe); 释放套接字连接。 另外,请记住通过调用 ISOCKET_Cancel() 取消所有未完成的套接字操作。 例如: if (pMe->m_piSock) { ISOCKET_Cancel(pMe->m_piSock,0,0); ISOCKET_Release(pMe->m_piSock); pMe->m_piSock = NULL; } 设计成在后台运行、监听套接字的应用程序则属例外情况。
取消 DNS 查找回调函数的示例: // 检查是否可以取消回调。 如果是NULL // 则已经发生而不能取消。 if(pMe->cbkLookup.pfnCancel != NULL) { CALLBACK_Cancel(&pMe->cbkLookup); } 取消网络状态回调函数的示例: INETMGR_OnEvent(piNet, (PFNNETMGREVENT)CheckNetStatus, (void*)pMe, FALSE); 取消套接字回调函数的示例: ISOCKET_Cancel (pMe->m_pISocket, ReadCB, (void*)pMe); 第 2 个参数 (pfn) 和第 3 个参数 (pUser) 都为 NULL 时,即会取消所有注册的套接字回调函数。 套接字回调函数会在释放套接字时被取消,但是,AEECallbacks(参见上述 DNS 和网络状态示例)在释放 Net Manager 时不会被释放。 有关取消计时器回调函数,请参阅第 4 条。 对话框 - 应用程序中止时,对话栈被删除。 应用程序在中止时应注意激活对话级别。 数据库和文件: “数据库”上下文和“文件”上下文在OEM 级别进行维护,因此只要数据库/文件接口未释放,则应用程序不必执行任何特殊操作即可从相同的数据库索引/文件指针位置恢复。 声音: 保存当前 soundInfo 数据结构和当前音量。 取消注册声音状态回调函数并停止所有音调重放。 例如: // 保存 soundInfo ISOUND_Get(pMe->m_pI声音, &pMe->soundInfo); // 把音量存放到 pMe->soundVolume // 音量大小会通过 ISHELL_RegisterNotify 回调返回 ISOUND_GetVolume(pMe->m_pI声音); //停止音调和振动的播放 ISOUND_StopTone(pMe->m_pI声音); ISOUND_StopVibrate(pMe->m_pI声音); // 取消声音状态回调函数的注册 ISOUND_RegisterNotify(pMe->m_pI声音, NULL, NULL); //停止音调和振动的播放 ISOUND_StopTone(pMe->m_pI声音); ISOUND_StopVibrate(pMe->m_pI声音); //取消声音状态回调函数的注册 ISOUND_RegisterNotify(pMe->m_pI声音, NULL, NULL); 卸载资源(图像、大缓冲区、套接字等)。 它们可以在 EVT_APP_RESUME 中重新加载。这不是必需的,但由于它节省内存因此是有益的。 恢复时执行以下操作: IMENUCTL_SetActive (pMe->m_pIMenu, FALSE);通过分配内容 (ISTATIC_SetText) 并刷新内容来重用 IStatic 接口(中止时已重置)。 IStatic 控件的尺寸和属性仍保持不变,不需重新设置。 带文本内容的 IStatic 控件: IStatic 重置时已释放文本和标题的内存,因此需要重新分配文本和标题。 // 从资源文件度曲标题和文本字符串 nCharCount = ISHELL_LoadResString(pMe->a.m_pIShell, szResFile, IDS_RESET_TITLE, pszTitle, sizeof(pszTitle)); nCharCount = ISHELL_LoadResString(pMe->a.m_pIShell, szResFile, IDS_RESET_TEXT, pMe->m_pszText, TEXT_BUFFER_SIZE); // 设置标题和文本字符串的值 ISTATIC_SetText(pMe->m_pIStatic, pszTitle, pMe->m_pszText, AEE_FONT_BOLD, AEE_FONT_NORMAL); // 显示文本控件 ISTATIC_Redraw(pMe->m_pIStatic); 带动画位图 (IImage) 内容的 IStatic 控件: ISTATIC_SetText(pMe->m_pIStatic, NULL, (AECHAR *) pMe->m_pIImage, AEE_FONT_BOLD, AEE_FONT_NORMAL); ISTATIC_Redraw(pMe->m_pIStatic); 不必明确重新启动图像。 如果在中止事件时已释放 IStatic 控件,则在调用上述 ISTATIC_SetText 之前必须重新实例化 IStatic。下面介绍一个重新实例化 IStatic 的示例: if(ISHELL_CreateInstance(pMe->a.m_pIShell, AEECLSID_STATIC, (void **)&(pMe->m_pIStatic)) != SUCCESS) return; 重新启动 IImage 动画 IIMAGE_Start(pMe->m_pIImage, x, y); 启动计时器 ISHELL_SetTimer(pMe->m_pIShell, timerValue, TimerCB, (void*)pMe); 重新实例化以前释放的套接字。 例如: if(pMe->m_pINetMgr) { 设置已取消的回调函数(计时器、套接字、DNS 查找、网络状态回调函数)。 设置 DNS 查找回调函数的示例: CALLBACK_Init(&pMe->cbkLookup, GetHostByNameCB, pMe); INETMGR_GetHostByName(pINetMgr, &pMe->dnsresult, hostName, &pMe->cbkLookup); 设置网络状态事件回调函数的示例: (PFNNETMGREVENT)CheckNetStatus, (void*)pMe, TRUE); 设置套接字回调函数的示例: rv = ISOCKET_Read(piSock, (byte *)szBuf, sizeof(szBuf)); if (rv == AEE_NET_WOULDBLOCK) { // WOULDBLOCK => 现在已经没有可用的 数据 // 注册回调以稍后读取数据。 ISOCKET_Readable(piSock, CommonReadCB, (void*)pMe); return; } 有关设置计时器回调函数,请参阅第 4 条。 应用程序中止时,对话栈已被删除。 恢复时,应用程序应该重建对话栈并达到激活对话级别。 声音: 重新注册声音状态回调功能,恢复保存的 soundInfo 和音量,然后继续重放声音文件。 例如: // 注册声音状态播放函数 ISOUND_RegisterNotify(pMe->m_pI声音, &声音CB, (void *)pMe); // 重新安置存放的声音信息和音量 ISOUND_Set(pMe->m_pI声音, &pMe->soundInfo); ISOUND_SetVolume(pMe->m_pI声音, pMe->soundVolume); ISOUND_SetDevice(pMe->m_pI声音) // 使用 ISOUND_PlayTone() 、 ISOUND_PlayToneList()、 // ISOUND_PlayFreqTone() 或 ISOUND_Vibrate() 播放声音 根据情况刷新显示。 根据情况加载在中止事件代码中释放的资源。 OEM 例外: 如果在电话上运行重新调用的应用程序时初始化 BREW SMS 重新调用事件,则电话会出现内存争用和崩溃现象。 需要考虑的一点是:即使应用程序接收并处理 EVT_APP_SUSPEND 事件(即返回 TRUE),它也可能永远不会接收 EVT_APP_RESUME 事件。 请看以下示例: 接收到 SMS 时,另一个小程序自动启动。 原始小程序会中止。 如果 BREW 内存不足,则可能会决定将原始小程序从内存中删除。 在这种情况下,BREW 将发送原始小程序 EVT_APP_STOP 事件,然后将调用 AEEClsCreateInstance 函数中提供的 FreeAppData 指针。 因此,不会向原始小程序发送 EVT_APP_RESUME 事件。
今日推荐
|
重点推荐
领军企业技术文库
+更多领军技术文库
最新专题
电子杂志订阅
| ||||||||