Поддерживайте приложение Windows Mobile в режиме ожидания - PullRequest
2 голосов
/ 17 мая 2009

У меня есть простое приложение для Windows Mobile, которое записывает координаты GPS каждые 5 минут Проблема в том, что приложение работает нормально, пока экран приложение включено, как только телефон переходит в режим ожидания, приложение перестает работать. Когда я включаю устройство, приложение снова начинает работать.

Что мне делать, чтобы приложение работало даже в режиме ожидания?

Sandeep

Ответы [ 3 ]

6 голосов
/ 19 мая 2009

Мой опыт работы с 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);
4 голосов
/ 17 мая 2009

Посмотрите на функцию 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)
2 голосов
/ 27 мая 2009

Может быть, ответ на этот вопрос SO поможет: Как запустить код в Windows Mobile, пока он приостановлен? В нем используется режим "без присмотра", чтобы приложение работало с выключенным экраном.

...