操作系统  办公  实用知识  设计  开发  WEB开发  移动开发  数据库  软件工程  网管  安全  管理  信息化  答疑  渠道 

中止和恢复应用程序

2006-10-9 网友评论 0 条 点击进入论坛

下面几个例子说明可能会引起应用程序中止的情况:

电池电量不足警告

进入的电话呼叫

进入的非 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_Reset() 用于释放与标题和文本关联的内存。 恢复时,IStatic 的文本和标题必须重新分配。

重置带文本内容的 IStatic 控件的示例:

if (pMe->m_pIStatic != NULL)

ISTATIC_Reset (pMe->m_pIStatic);

带动画位图内容的 IStatic:
如果 IStatic 内容为动画位图 (IImage),则 必须执行以下两个步骤:
重置 IStatic: 这会将 IStatic 与 IImage 分离,但不释放 IImage 的内存。
if (pMe->m_pIStatic != NULL)

ISTATIC_Reset (pMe->m_pIStatic);

明确停止 IImage。 由于已停止且不释放 IImage,所以恢复时不需要重新实例化。
if (pMe->m_pIImage != NULL)

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);

释放套接字连接。
如果未释放套接字连接,则数据呼叫不会被中止。 相关的 PPP 通道会阻碍电话拨打/接收语音呼叫。 这在当前网络中确实如此,但在新一代网中会有所改观。

另外,请记住通过调用 ISOCKET_Cancel() 取消所有未完成的套接字操作。

例如:

if (pMe->m_piSock) {

ISOCKET_Cancel(pMe->m_piSock,0,0);

ISOCKET_Release(pMe->m_piSock);

pMe->m_piSock = NULL;

}

设计成在后台运行、监听套接字的应用程序则属例外情况。


取消回调函数,如计时器、套接字、DNS 查找和网络状态回调函数。

取消 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 的 IImage 内容。 不必象文本一样重新实例化 IImage,因为在中止代码中未释放 IImage 的内存。

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) {
piSock = INETMGR_OpenSocket(pMe->pINetMgr
AEE_SOCK_STREAM);
if(!piSock) {
CleanupApp(pMe);
return;
}
}

设置已取消的回调函数(计时器、套接字、DNS 查找、网络状态回调函数)。

设置 DNS 查找回调函数的示例:

CALLBACK_Init(&pMe->cbkLookup, GetHostByNameCB, pMe);

INETMGR_GetHostByName(pINetMgr, &pMe->dnsresult, hostName,

&pMe->cbkLookup);

设置网络状态事件回调函数的示例:
INETMGR_OnEvent(piNet,

(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 事件。

已有 0 位对此文章感兴趣的网友发布了看法    
我来评两句 登录邮箱: 密码:
  匿名发表
今日推荐
技术文库(共有 46473 篇文章)
操作系统
办公软件
实用知识
网络管理
软件开发
WEB开发
软件工程
数据库
设计在线
信息安全
行业信息化
管理信息化
重点推荐
电子杂志订阅
点击电子杂志名称查看样刊
输入E-mail地址即可订阅
E-mail