Это должен знать каждый

    Спрос на Android-разработчиков весьма велик сейчас. Я решил подготовить список того, что нужно знать каждому разработчику под эту платформу. Это не только то, что вас могут спросить на собседовании, а весь спектр знаний, который скорее всего пригодится в работе. Бонусом идет пара интерсных вопросов про платформу.


    Платформа Android:


    • Файл AndroidManifest.xml: зачем нужен, необходимые параметры, секции. Здесь нужно рассказать про таг <manifest> и <application>, рассказать про параметр packageName, про <uses-feature> и <uses-permission>, про компоненты приложения, которые указываются.
    • Структура проекта: assets, res, src, gen, libs. Что лежит в каждой папке, что должно лежать под версионным контролем, а что нет(папка gen   никогда не кладется в VCS). Соответственно ассеты, ресурсы(картинки, музыка, лэйауты), java-код, сгенеренный код, библиотеки.
    • Компоненты приложения. Activity, Service, BroadcastReceiver, ContentProvider. Зачем нужен каждый, как осуществляется работа, lifecycle каждого компонента. 
    • Особенности запуска Activity и Service. Что такое Task, Activity Stack. Как принимается решение о запуске процесса Service.
    • ContentProvider, зачем нужен, как используется. Доступ и использование ContentResolver. Работа с курсорами. Помнить про managed cursors.
    • BroadcastReceiver: статические и динамические, механизмы вызова, lifecycle.
    • Межпроцессное взаимодействие. Что такое и зачем нужен Intent, как передавать информацию с его помощью, что такое Bundle и зачем нужен Parcelable. IntentFilter и для чего применяется. Способы взаимодействия Activity и Service(старт, биндинг). AIDL(Android interface definiotn language).
    • Построение UI приложения. Что такое Layout и View, какие бывают типы layout'ов(4 штуки), зачем они применяются. Оптимизация UI под различные размеры экранов и плотность пикселей(использование dp).
    • Хранение данных в платформе: 4 типа. Internal, External Storage, DB, SharedPreferences. Варианты использование, отличия.
    • Локализация. Встроенные средства платформы для локализации, моменты выбора локали.
    • Виджеты. Механизм создания виджетов, доступные средства UI в них. Что такое AppWidgetProvider.
    • Работа в фоне. Когда использовать Service, когда AsyncTask. Что такое AsyncTask, его связь с UI. Сущность IntentService — что делает и чем полезна.
    • Модель безопасности в Android. Разрешения.
    • Использование телефонных средств: сенсоров, вибрации, GPS.
    • Новинки платформы: Loaders, Fragments, In-app billing.
    • Производительность в платформе: best practices. Неиспользование enums до 2.2, использование final и проч. Особенность работы на мобильном: ограничение по памяти и процессоу. 
    • Поддержка старых версий платформы: доступ до функциональности через Reflection.
    • Собственные views: механизмы отрисовки, Canvas.
    • Состояния компонент: какие компоненты системы могут сохранять состояния(Activity и View), способы сохранения и восстановления состояний, отличия механизмов для Activity и View.


    В качестве бонуса полезно знать:

    • Механизмы подписи приложений для публикации в Android Market.
    • Android NDK: вызов нативного кода
    • Фреймворки для разработки под различные мобильные OS: Titanium, PhoneGap и прочие.


    Core java. Все то, что нужно обычному java-разработчику.


    • Наследование в java, интерфейсы, абстрактные классы, классы, внутренние и анонимные. Множественное наследование интерфейсов, когда применяется. Замыкания.
    • Модификаторы в java: доступа, синхронизации, прочие(static и final). Влияние final на производительность.
    • Collections: типы коллекций(List, Set, Map). Различные реализации, применимость коллекций в тех или иных случаях. Сложность вставки, чтения и поиска в различных реализациях.
    • Многопоточность: потоки, способы синхронизации, методы wait и notify. Ключевое слово synchronized, когда используется, что означает. 
    • Отличия библиотеки классов Java SE и платформы Android.


    Несколько интересных вопросов про платформу:


    1. Есть Task 1, Task 2. В первом есть Activity A, на вершине — Activity B. Из Task 2 посылается intent на запуск Activity A, при этом у A в манифесте указан тип запуска = «singleTask». Что произойдет с Task 1? Как будет выглядеть стек Activity в Task 1? Что произойдет при нескольких нажатиях на кнопку Back?

    2. Есть сервис, который был запущен через binding с Activity. Что произойдет с сервисом, когда пользователь покинет соответствующую Activity? Что нужно сделать, чтобы изменить это поведение?

    3. Внутри Activity определен BroadcastReceiver как нестатический внутренний класс. Сможет ли такой ресивер получать интенты? Почему?

    Ответы на вопросы будут в комментариях.

    Материал для подготовки:

    Android Dev Guide

    P.S. Буду рад расширению данного списка.
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 22

      +2
      Вопросами 1 и 3 не интересовался, но со вторым: вылетит исключение, сервис будет завершен. Чтобы такой лажи не произошло, нужно сделать unbind в методе onDestroy().
        0
        Это верно. А что произойдет с сервисом, если выполнен unbind?
          0
          Если запускали сервис методом

          bindService(new Intent(this, EngineService.class), conn, Context.BIND_AUTO_CREATE);

          то сервис продолжит работу.
            +1
            Насколько я знаю, это не так. Если сервис был запущен через bindService, то он будет остановлен после unbind: в нем больше нет надобности. Не могу сейчас найти вопрос на SO, чтобы подтвердить. Чтобы изменить это поведение, нужно делать startService(), если хочется чтобы сервис продолжил работу после unbind.
              +4
              Сервис, запущенный через bind, может быть остановлен, если к нему никто не подключен. Совсем необязательно, что это произойдет сразу же после отключения последнего клиента.
                0
                Делайте unbind на ondestroy без страха. Если в remote service в этот момент, например, играла музыка в бэкграунде она замечательным образом продолжит играть (10 минут назад закончил плеер). Для этого собственно сервисы и созданы. Вот насчет local service — сложнее. Локальные запускаются в отдельном потоке, но в контексте приложения, т.е. при выходе из приложения (ondestroy) будет закрыт и поток, в котором запущен сервис. Не проверял, но думаю что так. Тем не менее с unbind это не связано. Насколько я понимаю unbind просто «отключит» текущее активити от сервиса. Но к одному сервису (в том числе локальному) могут обращаться сколько угодно activity.
          0
          Предположение на счет 3: если в манифесте этот ресивер прописан, и внутри класса он public, то вполне возможно. Это ИМХО, сам не проверял
            +1
            Возможно, загвоздка в том, что класс не статический, и, соответственно, требует инстанс класса, для которого он внутренний.
          +1
          1) singleTask стартует новый таск, но т.к. активити A уже существует, будет показан этот экземпляр, а все, что выше, скорее всего отправится в мусор. При нажатии Back выйдем на рабочий стол (при условии что A было в корне).
            +1
            Почти так и есть. Особенность в том, что существует Task 2. Таким образом мы вернемся к top-activity этого второго таска.
              0
              и более того один раз наблюдал очень странное поведение… если у единственного активити в Task1 вызвать isTaskRoot() вернется false, если есть это активити в Task 2
                0
                сорри, не *это активити в Task 2, а просто есть активити в Taks2
            0
            Нафига сгенерированный код (см пункт 1) под версионный контроль класть?
              +2
              перечитайте внимательней. в первой части было сказано, что папку gen не надо в vcs, а во второй типа описание содержимого всех папок слева направо.
              +1
              Не встретил в вопросах упоминания о IntentService. Очень полезная абстракция.
                0
                Спасибо, добавил упоминание.
                –1
                Ужас сколько всего. Я ещё разбирался с native и opengl обёртками. Фрагменты кто-нибудь использует? У меня прога с API version 1, уж не знаю зачем, есть пара сотен пользователей, а фрагменты с четвёрки.
                Кстати, reflection не рекомендую(т), лучше использовать отложенную загрузку.
                  +1
                  А можно увидеть работу автора? Желательно, с применением хотя бы половины из перечисленных «необходимых» знаний 8)
                    0
                    Конечно. Пожалуйста.
                      +1
                      судя по вашим приложениям

                      сложилось ощущение, что все вы написали просто взяли из содержания книги по андроид

                      лично мое мнение состоит в том, что у вас необоснованно указано ограничение на версию Android (2.0 и выше). В то же время для платной версии у вас указано минимальная версия 1.6. Глядя на функционал это больше похоже на правду. Стоит отметить, что приложение было выложено еще в 2010 г… В то время долю Android 1.6 не стоило отбрасывать.

                      То же самое и насчет второго приложения (Football Referee Cards). Чем обосновано ограничение на версию андроид?

                      Есть ли другие ваши приложения?

                  Only users with full accounts can post comments. Log in, please.