Вопросы на собеседовании по Android в 2020 году

1. Четыре основных компонента Android

1. Что такое шаблоны проектирования Android? Что такое прокси-режим, заводской режим? В чем разница между простым фабричным шаблоном и абстрактным фабричным шаблоном?

Одноэлементный режим:

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

Режим голодного человека уже создал объекты в памяти при инициализации класса, обменивая пространство на время, поэтому проблем с безопасностью потоков нет.

Режим ленивого человека создает объект после вызова метода, обменивая время на пространство, что рискованно в многопоточной среде.


2. В чем разница между двумя режимами запуска Сервиса? При создании службы в режиме bindService ServiceConnection может отслеживать состояние службы.Сколько существует идентификационных статусов?

Разница жизненного цикла; связь с жизненным циклом деятельности.

ServiceConnection умеет следить за состоянием сервиса, при привязке сервиса его флаги могут быть следующих типов (здесь 3 типа):

1).Контекст.BIND_AUTO_CREATE    

  Описание: При получении запроса на привязку, если служба не была создана, она будет создана немедленно.При нехватке системной памяти приоритетный компонент необходимо уничтожить первым, чтобы освободить память, и только тогда, когда процесс, который находится в служба становится уничтоженным объектом, служба будет уничтожена.

2).Контекст.BIND_DEBUG_UNBIND    

  Описание: обычно используется в сценариях отладки, чтобы оценить правильность связанной службы, но легко вызвать утечку памяти, поэтому не рекомендуется для целей, не связанных с отладкой.

3).Context.BIND_NOT_FOREGROUND    

  Описание: Указывает, что система будет препятствовать тому, чтобы процесс, находящийся в службе, имел приоритет переднего плана и выполнялся только в фоновом режиме.Этот флаг введен в Froyo.

3. Четыре режима запуска Activity, всплывающий механизм и механизм push-stack.

10. Фреймворки, часто используемые в проектах

11. Активность, Фрагмент, Жизненный цикл службы

Ссылка: https://blog.csdn.net/q1113225201/article/details/76595460

Активность:

onCreate(): выполняется при первом запуске Activity;

onStart(): выполняется, когда активность видна;

onResume(): выполняется, когда действие может получить фокус пользователя;

onPause(): выполняется, когда активность видна, но теряет фокус;

onStop(): выполняется, когда действие находится в невидимом состоянии;

onRestart(): выполняется, когда действие вызывается снова, когда действие не уничтожено;

onDestory(): выполняется при уничтожении Activity;
Фрагмент:

onAttach(): Fragment и Activity завершают привязку;

onCreate(): Инициализировать фрагмент, вызывается только один раз;

onCreateView(): инициализировать макет фрагмента;

onActivityCreated(): вызывается после выполнения метода onCreate Activity;

onStart(): выполнять, когда фрагмент виден;

onResume(): выполняется, когда фрагмент может получить фокус;

onPause(): выполняется, когда фрагмент виден, но теряет фокус;

onStop(): выполняется, когда фрагмент невидим;

onDestoryView(): макет фрагмента удален, но не отвязан от Activity;

onDestory(): уничтожить фрагмент;

onDetch(): отключиться от Activity;

Служба:
startService启动: onCreate, onStartCommand, onDestroy

bindService启动: onCreate, onBind, onUnBind, onDestroy

12. Версии Android 6.0, 7.0 и выше, на что нужно обратить внимание при разработке.

13. Механизм связи Binder, как Binder используется различными процессами приложения, как запускается Binder.

Два, многопоточность

1. Два способа создания тредов в Android и их сравнение

    Наследовать поток; реализовать интерфейс Runnable.

2. Настройка приоритета потока

setPriority для установки приоритета потока, диапазон 0-10, по умолчанию 5

3. Как AsyncTask реализует асинхронную связь между основным и рабочим потоком

4. Использование HandlerThread

Наследовать класс Thread и инкапсулировать класс обработчика

5. Механизм реализации пула потоков, четыре часто используемых пула потоков.

FixedThreadPool — пул потоков с фиксированным количеством потоков, которые можно использовать повторно , пул потоков с фиксированным числом, а очередь задач не имеет ограничения по размеру,
        есть только основные потоки, а основные потоки здесь не имеют ограничения по таймауту, т.к. он не будет перезапущен, поэтому может Быстрее реагировать
CachedThreadPool—— пул потоков, который создает потоки в соответствии с потребностями
    Количество потоков не фиксировано, может выполняться автоматический перезапуск потоков, только неосновные потоки и максимальное количество потоков является Integer.MAX_VALUE
    подходит для большого количества менее трудоемких задач Task
SingleThreadExecutor — пул потоков одного рабочего потока
    имеет только один основной поток, и все задачи выполняются последовательно в одном потоке, поэтому нет необходимости имеет дело с синхронизацией потоков ScheduledThreadPool — пул
потоков , который может выполнять временные и периодические задачи
    Количество основных потоков фиксировано, а количество неосновных потоков не ограничено, а неосновные потоки будут перерабатываться, когда они простаивают; подходит для выполнение запланированных задач и задач с фиксированным периодом

Почему пул потоков использует (блокирующие) очереди?

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


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


RejectedExecutionHandler: Политика насыщения (всего 4 типа):
1.AbordPolicy: Невозможно обработать новые задачи и генерирует исключение RejectedExecutionException.
2.CallerRunsPolicy: используйте поток, в котором находится вызывающий объект, для обработки задачи. Эта стратегия обеспечивает простой механизм управления обратной связью, который замедляет отправку новых задач.
3. DiscardPolicy: задача, которую невозможно выполнить, и задача будет удалена.
4. DiscardOldestPolicy: отменить последнюю задачу в очереди и выполнить текущую задачу.

6. Блокировка статического метода и блокировка нестатического метода отличаются доступом.
7. Роль летучих

8. Почему потоки небезопасны? Поточно-небезопасное решение?

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

9. Почему HashMap не является потокобезопасным при параллелизме? Решить с помощью ConcurrentHashMap

10. Что такое ThreadLocal?

ThreadLocal — это не Thread, а локальная переменная Thread.

11. принцип шины событий

3. Процесс

1. Почему связь AIDL необходима для сериализации данных объекта? При передаче объекта из одного процесса в другой объект остается тем же объектом?

Не тот же объект, потому что процесс не разделяет память, поэтому адрес хранения объекта не является общим, адрес хранения объекта изменился, поэтому объект не является объектом.

2. Механизм связи AIDL и анализ исходного кода заглушки

3. Читали ли вы исходный код класса Stub, реализующего интерфейс AIDL в Servie? Какие методы содержатся внутри класса Stub?

4. Сеть

1. Разница между tcp и udp

5. Коллекция

1. Принцип работы HashMap

     Концепция хэширования Применение equals() и hashCode()
     для разрешения коллизий в HashMap
    и их важность в HashMap
    Преимущества неизменяемых объектов
    HashMap Многопоточная условная конкуренция
    Повторная настройка размера HashMap

     Процесс операции положить и получить

    Разница и связь между HashMap и Hashtable:

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

   разница:

    1. Hashtable — это интерфейс, предоставленный ранее, а HashMap — это интерфейс, предоставленный новой версией JDK.

    2. Hashtable наследует класс Dictionary, а HashMap реализует интерфейс Map.

    3. Hashtable является потокобезопасным, а HashMap не является потокобезопасным.

    4. Hashtable не допускает нулевых значений, а HashMap допускает нулевые значения.

2. Разница между четырьмя ссылочными типами

Сильная ссылка (Strong Reference) недостаточно памяти, не переработана.
Мягкая ссылка (WeakReference) Память не восстанавливается, и память не восстанавливается.
Слабые ссылки (SoftReference) каждый раз перерабатываются.
Фантомная ссылка (PhantomReference) не владеет экземпляром объекта и будет уведомлена системой, когда объект будет повторно использован.

3. Как сортировать arraylist<String>?

Collections.sort, значение по умолчанию — по возрастанию.

4. Ключ hashMap — это объект, как его сортировать?

(1) Создайте простой HashMap и вставьте несколько ключей и значений.

Map<String,Integer> hashMap = new HashMap<String,Integer>(); 
hashMap.put("Пять", 5); 
hashMap.put("Семь", 7);
hashMap.put("Четыре", 4);
hashMap.put("Восемь", 8); 
hashMap.put("Один", 1); 
hashMap.put("Два", 2); 
hashMap.put("Три", 3); 

(2) Используйте Set entrySet(): верните набор представлений объекта Map.Entry, то есть пару ключевое слово/значение на изображении.

Set<Map.Entry<String,Integer>> mapEntries = hashMap.entrySet();

(3) Создайте LinkedList из вышеуказанных элементов карты. Мы отсортируем этот связанный список, чтобы решить проблему порядка.

List<Map.Entry<String,Integer>> aList = new LinkedList<Map.Entry<String,Integer>>(mapEntries); 

(4) Collections.sort() — это встроенный метод, который сортирует только список значений в порядке возрастания по умолчанию.

(5) Восстановить значения после сортировки по возрастанию в hashMap.

5. Расскажите мне о разнице между списком, набором и картой?

 

6. Ява

1. В чем разница между абстрактным классом и интерфейсом? Когда использовать интерфейс вместо абстрактного класса?

2. Разница между параллелизмом и параллелизмом

3. Три принципа параллелизма — атомарность, видимость, упорядоченность и принципы, которым удовлетворяет ключевое слово volatile?

volatile: неатомарность, видимость, упорядоченность.

7. Алгоритм

1. Сортировка выбором, быстрая сортировка?

8. Исходный код

1, системный интерфейс

九、JNI

1. Как слой jni получает класс слоя java и каков принцип реализации?

2. Разница между локальными и глобальными ссылками

3. Как построена среда java слоя jni?

10. Дополнение

1. Каковы три значения датчика ускорения x, y и z?

      Значения x, y и z представляют значение ускорения, направление x — слева направо, y — сверху вниз, а z — изнутри наружу.

2. Каков внутренний механизм реализации внутреннего класса прокси-агента в классе обслуживания?

      Базовая реализация методов asBinder и onTransact.

3. Пример проекта по оптимизации памяти Andriod.

4. Например, проект утечки памяти Andriod.

5. Почему диалоговое окно не может использовать контекст приложения?

6. Отличие Jvm, Dalvik и Art.

7. Существует несколько способов связи между модулями Android.

     1) Event Bus EventBus: отражение + полиморфизм.

     2) Переадресация маршрута: ActivityRouter

     3) трансляция

8. Что такое ANR? Тайм-аут, например.

9. Для знакомых сторонних фреймворков приложений или плагинов приведите примеры.

10. Компонентизация Android

11. Процесс рендеринга OpenGL.

 

 

 

рекомендация

отblog.csdn.net/github_27263697/article/details/107400650