Поддерживайте приложение Windows Mobile в режиме ожидания
У меня есть простое приложение для Windows Mobile, которое записывает GPS-координаты каждые 5 минут. Проблема в том, что приложение работает нормально, пока экран включен, как только телефон переходит в режим ожидания, приложение перестает работать. Когда я включаю устройство, приложение снова начинает работать снова.
Что мне делать, чтобы приложение работало даже в режиме ожидания?
Sandeep
3 ответа
Мой опыт работы с GPS заключается в том, что для исправления требуется некоторое время (по крайней мере, на моем устройстве), поэтому я думаю, что вы должны постоянно держать телефон в режиме ожидания. Когда я играл с моим устройством, я заметил, что мне нужно использовать встроенный музыкальный проигрыватель, чтобы исправить ситуацию, когда экран выключен. Как указал ratchetr, PowerPolicyNotify(PPN_UNATTENDEDMODE,TRUE), кажется, является правильным способом предотвращения "требования к музыкальному проигрывателю".
Изменить: Также кажется, что вы должны использовать SetPowerRequirement / ReleasePowerRequirement на некоторых устройствах.
Вот пример C#:
public const int PPN_UNATTENDEDMODE = 0x0003;
public const int POWER_NAME = 0x00000001;
public const int POWER_FORCE = 0x00001000;
[DllImport("coredll.dll")]
public static extern bool PowerPolicyNotify(int dwMessage, bool dwData);
[DllImport("coredll.dll", SetLastError = true)]
public static extern IntPtr SetPowerRequirement(string pvDevice, CedevicePowerStateState deviceState, uint deviceFlags, string pvSystemState, ulong stateFlags);
[DllImport("coredll.dll", SetLastError = true)]
public static extern int ReleasePowerRequirement(IntPtr hPowerReq);
public enum CedevicePowerStateState : int
{
PwrDeviceUnspecified = -1,
D0 = 0,
D1,
D2,
D3,
D4,
}
//Keep the GPS and device alive:
PowerPolicyNotify(PPN_UNATTENDEDMODE, true)
IntPtr gpsPowerHandle = SetPowerRequirement("gpd0:", CedevicePowerStateState.D0, POWER_NAME | POWER_FORCE, null, 0);
//Call before exiting your app:
ReleasePowerRequirement(gpsPowerHandle);
PowerPolicyNotify(PPN_UNATTENDEDMODE, false);
Посмотрите на функцию CeRunAppAtTime. Передайте ему именованное событие и время, которое вы хотите запустить. Ждите события в потоке. Вы захотите вызвать PowerPolicyNotify, когда вы проснетесь, в противном случае устройство может снова приостановить работу, прежде чем вы закончите.
Код будет выглядеть примерно так
CeRunAppAtTime(eventName,now + 5 minutes)
while(!quit)
WaitForSingleObject(event,timeout)
PowerPolicyNotify(PPN_UNATTENDEDMODE,TRUE)
DoGpsStuff()
CeRunAppAtTime(eventName,now + 5 minutes)
PowerPolicyNotify(PPN_UNATTENDEDMODE,FALSE)
Может быть, ответ на этот вопрос так полезен: как я могу запускать код в Windows Mobile, пока он приостановлен? Он использует режим "без присмотра", чтобы приложение работало с выключенным экраном.