Symbian 活动对象实例----异步方法请求,检测系统响铃的状态的变化:当系统响铃状态变化(如过期等)时,系统将会调用活动对象中的RunL方法。
.h头文件
#ifndef CALARMNOTIFIER_H_
#define CALARMNOTIFIER_H_
#include <e32base.h>
#include <ASCliSession.h>
class CZDNoteAlarmNotifier: public CActive
{
public:
virtual void RunL();
void StartL();
public:
static CZDNoteAlarmNotifier* NewL();
CZDNoteAlarmNotifier();
void ConstructL();
public:
virtual ~CZDNoteAlarmNotifier();
private:
virtual void DoCancel();
private:
RASCliSession iAlarmServer;
TAlarmId iAlarmId;
};
#endif /* CALARMNOTIFIER_H_ */
.cpp实现文件
#include "AlarmNotifier.h"
CZDNoteAlarmNotifier* CZDNoteAlarmNotifier::NewL()
{
CZDNoteAlarmNotifier* self = new (ELeave) CZDNoteAlarmNotifier();
CleanupStack::PushL(self);
self->ConstructL();
CleanupStack::Pop(self);
return self;
}
CZDNoteAlarmNotifier::CZDNoteAlarmNotifier():CActive(0)
{
// TODO Auto-generated constructor stub
User::LeaveIfError(iAlarmServer.Connect());
CActiveScheduler::Add(this); //将自己加入到活动规划器中(调用此方法应确保活动规划器已经开启)
}
void CZDNoteAlarmNotifier::ConstructL()
{
}
void CZDNoteAlarmNotifier::RunL()
{
if(iStatus == EAlarmChangeEventTimerExpired)
{ //如果响铃时间过期,则进行相应的操作
}
StartL(); //监听下一个系统响铃的状态
}
void CZDNoteAlarmNotifier::StartL()
{
Cancel(); //取消异步函数请求
iStatus = KRequestPending; //重置为初始状态
iAlarmServer.NotifyChange(iStatus, iAlarmId);
SetActive();
}
void CZDNoteAlarmNotifier::DoCancel()
{
iAlarmServer.NotifyChangeCancel();
iAlarmServer.Close();
}
CZDNoteAlarmNotifier::~CZDNoteAlarmNotifier()
{
// TODO Auto-generated destructor stub
Cancel(); //Cancel方法会调用DoCancel()方法来释放资源
}