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

В состав SailfishOS SDK (работа с которым была описана в прошлой статье) входит Sailfish Silica — QML модуль, использующийся для создания Sailfish приложений. Данный модуль содержит QML компоненты, которые выглядят и управляются в соответствии со стандартами приложений для Sailfish. Помимо прочего, Sailfish Silica так же содержит инструменты для создания специфических элементов Sailfish приложений, таких как, например, Cover Page, которые были немного затронуты в прошлой статье. Для того, чтобы воспользоваться модулем Sailfish Silica и его инструментами и компонентами, необходимо просто импортировать данный модуль в QML файлы кода приложения. Это будет показано в примере чуть позже.

ApplicationWindow


QML основной любого Sailfish приложения является компонент ApplicationWindow, который описывает окно приложения и содержит пользовательский интерфейс приложения и вообще является основной и обязательной входной точкой загрузки Sailfish приложения. Экраны же приложения реализуются при помощи компонента Page. При этом ApplicationWindow содержит свойство initialPage, позволяющее установить начальный экран приложения. Таким образом минимальное приложение для платформы Sailfish будет выглядеть следующим образом:
import QtQuick 2.2
import Sailfish.Silica 1.0

ApplicationWindow {
    initialPage: Component {
        Page {
            Label {
                text: "Привет, Хабр!"
                anchors.centerIn: parent
            }
        }
    }
}

Данное приложение будет отображать одну простую страницу с надписью Привет, Хабр! посередине. Не обязательно описывать саму страницу прямо в описании свойства, можно просто передать туда id страницы или URL файла, где описана страница.

Page Stack


Помимо начальной страницы, ApplicationWindow так же содержит свойство pageStack — содержащее компонент Page Stack, позволяющий управлять стеком экранов (или страниц) приложения. В примере выше, Page Stack состоит всего из одной страницы, которая была положена на этот стек с помощью свойства initialPage. Добавить страницу на верх стека страниц (и, соответственно, отобразить ее на экране) можно с помощью метода push(), передавая ему в качестве аргумента путь до QML файла со страницей либо id этой страницы. Расширим наш пример, добавив под надпись кнопку, при нажатии на которую будет происходить переход на следующую страницу (будем предполагать, что код этой страницы содержится в файле SecondPage.qml):
ApplicationWindow {
    initialPage: initialPage
    Page {
        id: initialPage
        Label {
            id: helloLabel
            text: "Привет, Хабр!"
            anchors.centerIn: parent
        }
        Button {
            text: "Следующий"
            anchors.top: helloLabel.bottom
            anchors.horizontalCenter: parent.horizontalCenter
            onClicked: pageStack.push(Qt.resolvedUrl("SecondPage.qml"))
        }
    }
}

В метод push() так же, вместо одной страницы, можно передать массив, содержащий несколько страниц. В таком случае все эти страницы будут добавлены на стек. У данного метода есть еще два опциональных аргумента. Первый — это параметры страницы, а второй — тип операции, определяющий нужно ли использовать анимацию при переходе на заданную страницу. Он может быть одним из двух значений: PageStackAction.Animated или PageStackAction.Immediate. Данный аргумент так же присутствует и во всех других методах Page Stack, которые отвечают за смену текущей страницы (например, метод pop, который будет рассмотрен далее). По умолчанию все переходы осуществляются с анимацией, что удобно. Если по какой-то причине анимация при переходе не нужна, можно вызвать метод следующим образом:
pageStack.push(Qt.resolvedUrl("SecondPage.qml"), { }, PageStackAction.Immediate)

Для того, чтобы вернуться на предыдущую страницу нужно на компоненте Page Stack вызвать метод pop(). Этот метод уберет со стека самую верхнюю страницу и, соответственно, перейдет на страницу назад. Опционально методу можно так же указать некоторую страницу, которая уже есть на стеке. В этом случае, метод уберет со стека все страницы, расположенные на стеке выше указанной. Здесь так же стоит отметить, что переход назад в платформе Sailfish OS реализован с помощью горизонтального свайпа от левого края экрана, однако в Sailfish Silica данный функционал уже реализован и при данном жесте автоматически вызывается метод pop(), что удобно, поскольку разработчику не нужно прилагать усилий для реализации стандартного функционала.

Кроме вышеописанных методов, Page Stack так же предоставляет такие свойства как depth (количество страниц в стеке) и currentPage (текущая страница), а также такие методы, как:
  • replace() — заменяет текущую верхнюю страницу на стеке,
  • pushAttached() — добавляет указанную страницу на верх стека, но не осуществляет переход к ней (пользователь может перейти к данной странице с помощью горизонтального свайпа от правого края экрана),
  • navigateForward() и navigateBack() — осуществляют переход на, соответственно, следующую или предыдущую страницу в стеке относительно текущей, при этом не изменяя сам стек.

Конечно, выше описаны не все методы и свойства компонента Page Stack. Однако, основные, которые могут пригодиться в первую очередь, я попытался описать. Подробнее про компонент можно прочитать в официальной документации.

Dialog


Диалоги в Sailfish OS представляют собой те же самые страницы. Однако, предназначены они для того, чтобы отобразить пользователю некоторые данные, с которыми он может согласиться или не согласиться. Причем сделать он может это как нажатием на кнопки, так и свайпом влево (согласиться) или вправо (отказаться). Поскольку, диалог представляет собой особую страницу, то и в Sailfish Silica компонент Dialog «наследуется» от компонента Page. Заменим в предыдущем примере переход на следующую страницу на показ минимального диалога. Для этого опишем диалог в нашем ApplicationWindow:
ApplicationWindow {
    initialPage: initialPage
    Page {
        id: initialPage
        Label {
            id: helloLabel
            text: "Привет, Хабр!"
            anchors.centerIn: parent
        }
        Button {
            text: "Следующий"
            anchors.top: helloLabel.bottom
            anchors.horizontalCenter: parent.horizontalCenter
            onClicked: pageStack.push(dialog)
        }
    }
    Dialog {
        id: dialog
        Label {
            text: "Я - диалог"
            anchors.centerIn: parent
        }
    }
}

Даже показ диалога осуществляется добавлением его на стек страниц. Если запустить приложение и нажать на кнопку, то мы увидим следующее:

Как видите, внешне данный минимальный диалог ничем не отличается от обычной страницы. Однако, его поведение отличается: при свайпе влево или вправо (или нажатии на белые области в верхнем левом или нижнем углу) диалог закроется и будет показана начальная страница приложения. При этом в зависимости от направления свайпа вызовется соответствующий сигнал диалога (onRejected или onAccepted). Это можно проверить, добавив в диалог обработчики данных сигналов, которые будут изменять текст на главной странице:
onAccepted: helloLabel.text = "Согласился"
onRejected: helloLabel.text = "Отказался"

Так же на диалоге можно с помощью компонента DialogHeader добавить стандартные кнопки «Cancel» и «Accept» вверху диалога. При этом для отображения данных кнопок достаточно просто добавить пустой компонент. Опционально можно так же указать свойство title, которое определит текст, который будет расположен под кнопками. Данный текст обычно используется для отображения вопроса к пользователю. Добавим DialogHeader в диалог из примера выше:
Dialog {
    id: dialog
    DialogHeader {
        title: "Простой диалог"
    }
    Label {
        text: "Я - диалог"
        anchors.centerIn: parent
    }
    onAccepted: helloLabel.text = "Согласился"
    onRejected: helloLabel.text = "Отказался"
}

Теперь он выглядит так:


Следует отметить, что при запуске примера выше вы можете увидеть следующие предупреждения:
[W] unknown:189 - file:///usr/lib/qt5/qml/Sailfish/Silica/DialogHeader.qml:189: TypeError: Cannot read property 'backIndicatorDown' of null
[W] unknown:194 - file:///usr/lib/qt5/qml/Sailfish/Silica/DialogHeader.qml:194: TypeError: Cannot read property 'backIndicatorDown' of null
[W] unknown:247 - file:///usr/lib/qt5/qml/Sailfish/Silica/DialogHeader.qml:247: TypeError: Cannot read property 'forwardIndicatorDown' of null
[W] unknown:242 - file:///usr/lib/qt5/qml/Sailfish/Silica/DialogHeader.qml:242: TypeError: Cannot read property 'forwardIndicatorDown' of null

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

Подробнее о Dialog можно почитать в официальной документации.

Жизненный цикл приложений и Cover


Жизненный цикл приложений для Sailfish OS весьма прост. Поскольку в платформе реализована полноценная многозадачность, приложение может находится в одном из трех состояний: либо оно не запущено вовсе, либо оно работает в фоне (background), либо работает в активном режиме (foreground). При этом в активном режиме приложение развернуто во весь экран, тогда как в фоновом режиме приложение представлено своей миниатюрой (называемой cover) на главном экране системы (об этом было немного написано в предыдущей статье). Определить в каком именно состоянии находится приложение можно с помощью свойства Qt.application.state. Если приложение находится в фоне, данное свойство принимает значение Qt.ApplicationInactive. В противном случае — Qt.ApplicationАctive. Состояние приложения необходимо знать и использовать, например, для остановки тяжелых вычислительных задач или анимаций, когда приложение находится в фоне, чтобы не тратить ресурсы системы.

Когда приложение находится в фоне, на главном экране отображается его миниатюра — cover. Описать этот cover в коде приложения можно с помощью компонента Cover. По умолчанию в приложении уже установлен cover, который выглядит следующим образом:

Установить свой cover можно с помощью свойства cover компонента ApplicationWindow. Переделаем пример выше так, чтобы при нажатии на кнопки в диалоге менялся текст не на главном экране приложения, а на его cover:
ApplicationWindow {
    initialPage: initialPage
    cover: cover
    Page {
        id: initialPage
        // Описание главной страницы приложения...
    }
    Cover {
        id: cover
        transparent: true
        Label {
            id: coverLabel
            text: "Привет, Хабр!"
            anchors.centerIn: parent
        }
    }
    Dialog {
        id: dialog
        DialogHeader {
            title: "Простой диалог"
        }
        Label {
            text: "Я - диалог"
            anchors.centerIn: parent
        }
        onAccepted: coverLabel.text = "Согласился"
        onRejected: coverLabel.text = "Отказался"
    }
}

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

Sailfish OS так же позволяет cover выполнять ресурсоемкие задачи: анимации, вычисления и т.д. Однако, стоит отметить, что поскольку приложение может находится в фоне вместе с другими приложениями и его миниатюра отображена на ряду с остальными, то задачи эти не должны нагружать систему постоянно и должны выполняться периодически. Например, погодное приложение должно обновлять свой cover только когда с сервера приходят новые данные о погоде. Кроме того, не стоит выполнять такие задачи, когда миниатюра не видна пользователю (например, когда закрыт главный экран). Для этого можно использовать свойство status, которое принимает одно из следующих значений:
  • Cover.Inactive — миниатюра не видна и пользователь не может с ней взаимодействовать,
  • Cover.Active — миниатюра видна и пользователь может с ней взаимодействовать,
  • Cover.Activating — миниатюра переходит в статус Cover.Active,
  • Cover.Deactivating — миниатюра переходит в статус Cover.Inactive.


Помимо этого cover так же может предоставлять пользователю возможность управления приложением непосредственно с самой миниатюры. Для этого с помощью компонента CoverActionList, внутри которого определяются компоненты CoverAction, можно добавить на миниатюру кнопки. Например, для музыкального плеера это могут быть кнопки остановки и воспроизведения композиции, а также кнопки перехода на следующий или предыдущий трек. Добавим кнопку управления на миниатюру из нашего примера. Эта кнопка будет менять надпись на нашей миниатюре:
Cover {
    id: cover
    transparent: true
    Label {
        id: coverLabel
        text: "Привет, Хабр!"
        anchors.centerIn: parent
    }
    CoverActionList {
        CoverAction {
            iconSource: "image://theme/icon-cover-next"
            onTriggered: coverLabel.text = "Следующий!"
        }
    }
}

Подробнее про Cover можно прочитать в официальной документации.

Ориентация устройства


Как и другие мобильные устройства, устройства на платформе Sailfish OS поддерживают две возможных ориентации экрана: портретную и ландшафтную. Для того, чтобы узнать текущую ориентацию устройства можно воспользоваться свойствами isPortrait и isLandscape компонента Page, либо свойством orientation, которое принимает одно из следующих значений: Orientation.Portrait, Orientation.Landscape, Orientation.PortraitInverted или Orientation.LandscapeInverted. Так же, если важно проверить например, что устройство находится в портретной ориентации, а инвертировано оно или нет — не важно, то можно сравнить значение свойства orientation с маской Orientation.PortraitMask. Для ландшафтного режима существует аналогичная маска Orientation.LandscapeMask.

Если необходимо, чтобы приложение работало только в определенных ориентациях, то можно воспользоваться свойством allowedOrientations компонента ApplicationWindow, которому можно указать, в каких ориентациях должно работать приложение. В качестве значений можно указывать те же значения, что возвращает свойство orientation, а так же маски Orientation.LandscapeMask, Orientation.PortraitMask или Orientation.All. Значение по умолчанию свойства allowedOrientations зависит от конкретного устройства, поэтому если для приложения важно, что оно должно работать в определенных ориентациях (или в любых), то лучше указать это явно. Кроме того, это свойство можно указать и у компонента Page, тогда правило разрешенных ориентаций будет применяться только к конкретной странице.

На этом все. Однако, хотелось бы отметить, что не смотря на то, что в примерах данной статьи весь код был описан в одном файле, при написании реальных приложений лучше всего описывать каждую страницу и cover в отдельном QML файле. Это ускорит запуск приложения, поскольку предотвратит компиляцию всех QML компонентов при старте приложения.

В следующей статье я расскажу о других компонентах, входящих в состав Sailfish Silica.

Автор статьи: Денис Лаурэ
Поделиться с друзьями
-->

Комментарии (42)


  1. kirikch
    22.07.2016 20:26
    +1

    По теме.


  1. sergio_deschino
    23.07.2016 10:33

    Остаётся открытым только один вопрос: Где купить телефон на SailfishOS и, желательно, не китайского монстра.
    З.Ы. За перевод спасибо.


    1. kirikch
      23.07.2016 21:51

      Да вот, говорят, Intex начали рассылать повсеместно.


      1. wholeman
        24.07.2016 23:42

        Получается около 7 т.руб. Нормальная цена для такого аппарата. Интересно, насколько дороже будет сертифицированная версия, если появится.
        Жаль только, что всего 720p и экран, и камера. И в сенсорах не указаны ни компас, ни барометр, ни даже гироскоп. И NFC нет.


  1. wholeman
    23.07.2016 10:35
    +1

    Это всё, конечно, хорошо, но без достойного по характеристикам устройства и доступного (в том числе по цене) устройства, не очень интересно. Смысл вкладываться в разработку приложений для этой ОС неясен. Ради чего? В ближайшем будущем вряд ли удастся заработать на этом больше, чем на Windows Phone или Tizen, не говоря об iOS или Android. Для себя тоже бессмысленно, так как пользоваться можно только в эмуляторе.


    1. daihatsu
      23.07.2016 11:48

      Для некоторых вещей — прямой заработок неважен.
      Скажем, какому-нибудь Ватцапу это нужно для статуса универсального везде доступного месседжера.


      1. wholeman
        23.07.2016 15:21
        +1

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


        1. daihatsu
          23.07.2016 18:42

          99% мобильных приложений нафиг никуму не нужно. Они мусор, шлак.


          1. wholeman
            23.07.2016 20:30
            +1

            С другой стороны, внезапно оказывается, что приложений, которые мне нужны, нет. Например, среди 100500 таймеров в Google Play, мне не удалось найти такого, который устраивал бы меня хотя бы на 80%. С приложениями для бега ситуация ещё хуже — нигде не нашлось даже тех функций, которые я считаю основными. По крайней мере без ввода данных кредитки.


    1. kirikch
      23.07.2016 12:21
      -1

      Удастся заработать больше. Не на продажах своих приложений, но, например, на аутсорсинге.


      1. RPG18
        23.07.2016 13:01
        +1

        А как же экономическая теория: "Спрос рождает предложение"? Не вижу достаточного спроса на Sailfish, что бы зарабатывать да же на аутсорсинге.


        1. kirikch
          23.07.2016 14:46
          -2

          Спрос есть. То, что он не афишируется — это другой вопрос.


          1. RPG18
            23.07.2016 14:55

            Спроса нет, поэтому Jolla в 2015 испытывала финансовые трудности
            .
            Или Big bro планирует выпустить закон, по которому кого-то обязует покупать "отечественные" смартфоны с "отечественной" ос?


            1. kirikch
              23.07.2016 17:26

              Трудности она испытывала из-за проблем с компонентами.
              Спрос-то как раз был, который покрыть они не смогли из-за этих самых проблем.


              1. RPG18
                23.07.2016 19:53

                Вы путаете спрос и интерес. Если был бы спрос, то мы бы не видели новостей типа Jolla получила $12 млн инвестиций — компания продержится на плаву еще год. Факты — упрямая вещь.


                1. kirikch
                  23.07.2016 21:47

                  Вот факт на idiegogo было собрано 479% от ожидаемого.
                  По-моему, это спрос.


            1. daihatsu
              23.07.2016 18:44

              Вы так говорите, будто бы поддержка отечественного ПО — это плохо.

              Что, например, в наличие Яндекса что-то хуже, чем в наличие Яндекса + Гугля.

              Это у нас есть выбор.
              А у европейцев — его нет. Только Гугль.


              1. RPG18
                23.07.2016 19:57

                Почему же тогда не поддержать Яндекс.Кит, это то же отечественное ПО.


                Я против поддержки "инноваций" и "отечественного ПО" за счет казны под флагом импортозамещения.


                1. kirikch
                  23.07.2016 21:48
                  +1

                  Вообще, сейчас Sailfish OS развивается не за счёт казны, а за счёт частных инвесторов.


          1. denis_obrezkov
            24.07.2016 20:15
            +1

            А на кого нацелена эта система?
            Даже несмотря на моё положительное отношение к Linux, аппараты на Sailfish не хочется покупать — интерфейс выглядит очень неприятно, в MeeGo было лучше, имхо. Еще можно добавить, что есть аналогичная ОС, которая также использует технологию свайпов, но выглядит гораздо приятней — Blackberry OS 10.

            Интересно было бы так же почитать про нативные приложения Sailfish OS и их интеграцию друг с другом.


            1. kirikch
              25.07.2016 01:28

              Очень спорный вопрос о приятности, а тем более удобства.
              К интерфейсу Sailfish OS привыкается за пару дней. А вот отвыкать от него заметно дольше.
              До сих пор, если беру в руки устройство на, скажем, Android, пытаюсь свернуть приложения свайпом.

              Принятый принцип взаимодействия приложений — d-bus.
              Хотя все остальные механизмы Linux (сокеты, пайпы) вполне работают.


              1. denis_obrezkov
                25.07.2016 10:15

                Боюсь, что у человека перед покупкой нет пары дней, чтобы привыкнуть к интерфейсу Sailfish.

                Я про другую интеграцию. Как я понял, сейчас Sailfish выйдет в гос. сектор, где вроде бы сидят деловые люди. И вопрос в том, как интегрированы приложения между собой. К примеру, можно ли кликнуть на контакт, начать набирать ему письмо (назначить в нем тему и повестку), потом прямо из e-mail клиента добавить встречу в календарь с этим контактом, ну а в календаре кликнуть по этой встрече и перейти в письмо, в котором назначена встреча или же позвонить этому контакту? И чтобы календарь, к примеру, уведомил, что письмо-то с назначением встречи мы до сих пор не отправили.

                И еще, есть ли меню запуска приложений, как в Linux по Alt+F2. Чтобы можно было начать печатать слово, а на него вылезли бы все соответствующие контакты, приложения, цепочки писем?


      1. wholeman
        23.07.2016 15:29
        +2

        Кроме госконтор, которые могут загнать под эту платформу (а могут и не загнать или загнать, например, под Тайзен.ру) такой аутсорс не нужен.
        Если платформа не планирует выходить на открытый рынок, она мне неинтересна, как и большинству разработчиков.


        1. kirikch
          23.07.2016 17:32
          -1

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


          1. wholeman
            23.07.2016 20:05
            +1

            То, что устройств нет в свободной продаже, вполне понятно: надо допилить, сертифицировать и т.д. Но нет и нормальных анонсов. Есть специфический девайс Ермак, Ойстерс с довольно мутным описанием, будет ли в России что-то ещё — неизвестно. Возможные цены, естественно, тайна. Но мне почему-то кажется, что конкурентными они не будут. Возможно, после смартфонов на Ubuntu touch, которые стоили почти в два раза дороже аналогов на Android. Да и на девайс от Jolla цена была высоковато для его характеристик.


    1. daihatsu
      23.07.2016 12:28

      Если вдруг там будет рынок — то совсем наоборот, будет преимущество по заработку.
      Кто первый встал — того и тапки.


      1. wholeman
        23.07.2016 15:15

        Это — старая мантра. Я слышал её в отношении Maemo, Windows Phone, Tizen… К сожалению, она не работает.


        1. daihatsu
          23.07.2016 18:58

          А кто-то ее слышал по отношению к Андроиду и iOS — и упустил рынок.
          Всякое может быть.


          1. wholeman
            23.07.2016 20:42

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


      1. wholeman
        23.07.2016 15:44
        +1

        Да, экзотические платформы имеют свои прелести. Помнится, моё приложение класса helloworld для N9, написанное за неделю, долго не покидало бесплатный топ, у меня даже где-то есть скриншот магазина с ним на первом месте. Но это — не заработок.
        И это всё не отменяет необходимость иметь устройство для разработки, потому что эмулятор — это одно, а устройство — совсем другое. И многие косяки вылезают только в процессе регулярного использования.


        1. Disasm
          23.07.2016 15:53

          Выбирайте на ваш вкус: https://wiki.merproject.org/wiki/Adaptations/libhybris
          Сейчас более чем реально раздобыть устройство с Sailfish OS.


          1. wholeman
            23.07.2016 16:07

            Там нет официальной версии чтобы работали все функции аппарата. А разбираться, кто глючит, недоделанная ОС или моя программа, я не люблю (с упомянутым недоприложением такое как раз было, исправили в следующем релизе MeeGo).


            1. Disasm
              23.07.2016 16:11

              Это список аппаратов для тех, кому ехать. Шашечки нужно немного подождать. В этом году обещают в России выпустить сертифицированные аппараты.


              1. wholeman
                23.07.2016 16:29

                Шашечки дают надежду (а в идеальном мире даже гарантируют), что водитель действительно неплохо знает своё дело и не летит под 120, не глядя на светофоры. И что у машины не откажут тормоза. Я в своё время на таких накатался, надоело.
                Применительно к ОС и аппаратам тоже. А использую датчики и сенсоры, с адаптациями могут быть разные проблемы.


                1. Disasm
                  23.07.2016 16:33

                  Вы говорите об этом с точки зрения пользователя, а не разработчика. Если в мире останутся одни пользователи, то некому будет «неплохо знать своё дело». А разработка как раз о том, как сделать лучше, в том числе когда откажут тормоза.


                  1. wholeman
                    23.07.2016 16:53

                    Я говорю с точки зрения разработчика приложений. А тормоза — это в ведении системных программистов. Если я этим и занимаюсь, то только по нужде, если системщики сделали своё дело недостаточно хорошо (на что у них могут быть уважительные причины).


                    1. daihatsu
                      23.07.2016 19:01

                      Серьезные разработчики получают доступ к железу еще на этапах альфа-версий железа.


                      1. wholeman
                        23.07.2016 19:48

                        К серьёзным разработчикам серьёзные производители железа приходят сами и платят серьёзные бабки, чтобы они сделали свои приложения под их железо. Но вряд ли эта статья ориентирована на них.


  1. sleeply4cat
    23.07.2016 11:49

    Расскажите только одну вещь: что происходит при недостатке оперативной памяти? Умеет ли ось скидывать свёрнутые приложения в своп, или же закрывает их с потерей данных пользователя, как делают это популярные системы?


    1. kirikch
      23.07.2016 12:19

      Поведение такое же, как на ПК: swap, Out of Memory Killer


  1. agent10
    23.07.2016 17:56

    А как реализована поддержка разных размеров/разрешений/ppi? На сколько сложнее будет поддерживать по сравнению с Андроидом?


    1. kirikch
      23.07.2016 21:50

      Рассказано в конце видео, которое в первом комментарии.
      Слайды:
      Масштаб интерфейса: Theme.pixelRatio
      Выбор размера элементов: Screen.sizeCategory
      Выбор компоновки: Screen.sizeCategory