Пользовательские уведомления переключателя

Когда пользовательский переключатель происходит, OS X генерирует события для всех заинтересованных приложений. События отправляются в приложения в сеансе входа в систему каждый раз, когда сеанс входа в систему активирован или деактивирован. Если сеанс входа в систему не активирован или деактивирован, он не получает событий. Можно использовать события активации для выполнения следующих видов задач:

Уведомления углерода

Для приложений Углерода пользовательские уведомления переключателя проникают через менеджер событий Углерода. Приложения могут зарегистрироваться для получения kEventSystemUserSessionActivated и kEventSystemUserSessionDeactivated события, если они хотят знать, когда происходит переключатель. Следующий пример показывает Вам, как зарегистрироваться для этих событий:

pascal OSStatus switchEventsHandler (EventHandlerCallRef nextHandler,
                                        EventRef switchEvent,
                                        void* userData)
{
    if (GetEventKind(switchEvent)== kEventSystemUserSessionDeactivated)
    {
        // Perform deactivation tasks here.
    }
    else
    {
        // Perform activation tasks here.
    }
 
    return noErr;
}
 
void SwitchEventsRegister()
{
    EventTypeSpec switchEventTypes[2];
    EventHandlerUPP switchEventHandler;
 
    switchEventTypes[0].eventClass = kEventClassSystem;
    switchEventTypes[0].eventKind = kEventSystemUserSessionDeactivated;
    switchEventTypes[1].eventClass = kEventClassSystem;
    switchEventTypes[1].eventKind = kEventSystemUserSessionActivated;
 
    switchEventHandler = NewEventHandlerUPP(switchEventsHandler);
    InstallApplicationEventHandler(switchEventHandler, 2,
                                    switchEventTypes, NULL, NULL);
}

Уведомления какао

Для приложений Какао пользовательские уведомления переключателя проникают через совместно использованный центр уведомления NSWorkspace. Сами события пользовательского переключателя определяются в NSWorkspace и NSWorkspaceSessionDidBecomeActiveNotification и NSWorkspaceSessionDidResignActiveNotification. Для регистрации для этих уведомлений приложение (или его делегат) обеспечило бы метод обработчиков и затем зарегистрировало бы тот обработчик путем добавления себя как наблюдатель уведомления. Следующие выборочные методы иллюстрируют, как сделать это:

- (void) switchHandler:(NSNotification*) notification
{
    if ([[notification name] isEqualToString:
                NSWorkspaceSessionDidResignActiveNotification])
    {
        // Perform deactivation tasks here.
    }
    else
    {
        // Perform activation tasks here.
    }
}
 
// Register the handler
- (void) applicationDidFinishLaunching:(NSNotification*) aNotification
{
    [[[NSWorkspace sharedWorkspace] notificationCenter]
            addObserver:self
            selector:@selector(switchHandler:)
            name:NSWorkspaceSessionDidBecomeActiveNotification
            object:nil];
 
    [[[NSWorkspace sharedWorkspace] notificationCenter]
            addObserver:self
            selector:@selector(switchHandler:)
            name:NSWorkspaceSessionDidResignActiveNotification
            object:nil];
}

Синхронизация события

Уведомления переключателя User отправляются в приложения одновременно, переключатель происходит. Поскольку переключатель происходит относительно быстро, это обычно - не проблема. Однако для приложения возможно получить свое событие активации, прежде чем другие приложения получили свои события деактивации. Это могло привести к потенциальным условиям состязания между приложениями выпускающие и получающие совместно используемые ресурсы.

Для предотвращения условий состязания приложения в деактивированном сеансе должны продолжать высвобождать любые совместно используемые средства как можно скорее. Приложения в активируемом сеансе должны задержать сбор любых совместно используемых ресурсов, пока фактически не используются те ресурсы. Мало того, что эта справка может избежать потенциальных условий состязания, она может также улучшить полную производительность системы. Если Ваше приложение нужно в определенном ресурсе сразу же, но встречается с ошибками при попытке получить его, установить таймер и попытаться получить ресурс снова немного позже.

Уведомления завершения работы

Завершение работы и последовательности перезапуска не генерируют специальных уведомлений выключенным сеансам входа в систему. Без включенного быстрого переключения между пользователями нормальная последовательность должна уведомить приложения пользователя о нависшем завершении и дать им шанс прервать последовательность. Однако с включенным быстрым переключением между пользователями, только приложения для активного пользователя запрашиваются. Приложения в выключенных сеансах входа в систему уничтожаются без шанса сохранить любые изменения; иначе, существует потенциал, что процесс в одном из тех сеансов мог подвесить систему.

Если другие пользователи зарегистрированы, система предупреждает инициатора завершения работы или последовательности перезапуска, что те пользователи могли бы потерять несохраненные изменения. Когда другие пользователи зарегистрированы, это предупреждение только появляется. Пользователю предлагают пароль администратора гарантировать, что существует серьезное основание завершить работу или перезапустить машину. Пока у пользователя есть допустимый пароль администратора, доходы последовательности.

Для получения дополнительной информации о завершении работы и последовательности перезапуска для активного сеанса входа в систему, см. Руководство по программированию Демонов и Служб.