Android Mobile | YeaHub
431 subscribers
332 photos
21 videos
597 links
Теория, подготовка к интервью и курсы для Android разработчиков

YeaHub — это платформа для IT-специалистов, объединяющая обучение, карьерный рост, развитие и сообщество единомышленников.

Платформа: https://yeahub.ru

Для связи: @ruslan_kuyanets
Download Telegram
#ЧеКак
🤔 Как передать данные с одной Activity на другую?

В Android передача данных между Activity осуществляется через механизм Intent. Intent — это объект, который позволяет передавать данные и запускать компоненты, такие как Activity, Service и BroadcastReceiver.

🚩Передача данных с одной Activity на другую

🟠Передача данных через Intent
1⃣Создание Intent и добавление данных
В первой Activity создайте Intent и добавьте данные, которые хотите передать, используя методы putExtra.
// MainActivity.java
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("key", "value"); // передаем строку
intent.putExtra("number", 123); // передаем целое число
startActivity(intent);


2⃣Получение данных во второй Activity
Во второй Activity получите Intent, который запустил эту Activity, и извлеките данные из него.
// SecondActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);

// Получение Intent и извлечение данных
Intent intent = getIntent();
String value = intent.getStringExtra("key");
int number = intent.getIntExtra("number", 0); // 0 - значение по умолчанию

// Использование полученных данных
TextView textView = findViewById(R.id.textView);
textView.setText("String: " + value + ", Number: " + number);
}


🟠Передача объектов (Parcelable)
Если вам нужно передать сложные объекты, вы можете использовать интерфейс Parcelable. Этот интерфейс позволяет сериализовать объекты для передачи через Intent.

1⃣Создание класса, реализующего Parcelable
import android.os.Parcel;
import android.os.Parcelable;

public class User implements Parcelable {
private String name;
private int age;

public User(String name, int age) {
this.name = name;
this.age = age;
}

protected User(Parcel in) {
name = in.readString();
age = in.readInt();
}

public static final Creator<User> CREATOR = new Creator<User>() {
@Override
public User createFromParcel(Parcel in) {
return new User(in);
}

@Override
public User[] newArray(int size) {
return new User[size];
}
};

@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(name);
parcel.writeInt(age);
}

// Getters and setters (если нужны)
}


2⃣Передача объекта через Intent
// MainActivity.java
User user = new User("John", 30);
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("user", user);
startActivity(intent);


3⃣Получение объекта во второй Activity
// SecondActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);

Intent intent = getIntent();
User user = intent.getParcelableExtra("user");

// Использование полученного объекта
if (user != null) {
TextView textView = findViewById(R.id.textView);
textView.setText("Name: " + user.getName() + ", Age: " + user.getAge());
}
}


👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#ЧеКак
🤔 Как происходит составление хешмапы, если совпадает хеш-код?

Если два ключа имеют одинаковый хеш-код (коллизия), используются механизмы разрешения:
🟠Связанные списки (chaining): элементы с одинаковым хешем помещаются в один bucket в виде связанного списка.
🟠Сбалансированные деревья: современные реализации (например, в Java) используют деревья вместо списков для ускорения поиска при большом количестве коллизий.
🟠Метод equals используется для проверки уникальности ключей в случае совпадения хеша.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#ЛитКод
🤔 Задача: 672. Bulb Switcher II

Есть комната с n лампочками, пронумерованными от 1 до n, которые изначально все включены, и четыре кнопки на стене. Каждая из четырех кнопок имеет разную функциональность:

Кнопка 1: Переключает состояние всех лампочек.
Кнопка 2: Переключает состояние всех лампочек с четными номерами (т.е. 2, 4, ...).
Кнопка 3: Переключает состояние всех лампочек с нечетными номерами (т.е. 1, 3, ...).
Кнопка 4: Переключает состояние всех лампочек с номером j = 3k + 1, где k = 0, 1, 2, ... (т.е. 1, 4, 7, 10, ...).
Необходимо сделать ровно presses нажатий кнопок. Для каждого нажатия можно выбрать любую из четырех кнопок для нажатия.

Даны два целых числа n и presses, вернуть количество различных возможных состояний после выполнения всех presses нажатий кнопок.

Пример:
Input: n = 1, presses = 1
Output: 2
Explanation: Status can be:
- [off] by pressing button 1
- [on] by pressing button 2


👨‍💻 Алгоритм:

1⃣Рассчитаем возможные множества остатков: то есть какие множества c_i = f_i (mod 2) возможны.

2⃣Так как c_i ≡ f_i и c_i ≤ f_i, если ∑f_i ≠ ∑c_i, или если ∑f_i < ∑c_i, это невозможно. В противном случае это возможно простым построением: выполните операции, указанные c_i, затем выполните операцию номер 1 с четным числом оставшихся операций.

3⃣Для каждого возможного множества остатков симулируем и запоминаем, как будут выглядеть первые 6 лампочек, сохраняя это в структуре Set. В конце возвращаем размер этого множества.

😎 Решение:
class Solution {
fun flipLights(n: Int, m: Int): Int {
val seen = mutableSetOf<Int>()
val n = minOf(n, 6)
val shift = maxOf(0, 6 - n)
for (cand in 0 until 16) {
val bcount = Integer.bitCount(cand)
if (bcount % 2 == m % 2 && bcount <= m) {
var lights = 0
if ((cand shr 0 and 1) > 0) lights = lights xor (0b111111 shr shift)
if ((cand shr 1 and 1) > 0) lights = lights xor (0b010101 shr shift)
if ((cand shr 2 and 1) > 0) lights = lights xor (0b101010 shr shift)
if ((cand shr 3 and 1) > 0) lights = lights xor (0b100100 shr shift)
seen.add(lights)
}
}
return seen.size
}
}


👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 В Kotlin, как обозначить функцию, которая принимает переменное количество аргументов одного типа?
Anonymous Quiz
67%
Использовать vararg
22%
Использовать array
11%
Использовать list
0%
Использовать spread
#ЧеКак
🤔 Что такое мульти-декларации (destructuring declarations)?

Мульти-декларации (destructuring declarations или деструктуризирующее присваивание) — это способ извлечения значений из объекта и присвоения их сразу нескольким переменным. В Kotlin этот механизм поддерживается с помощью оператора распаковки (destructuring operator) — componentN(), где N — номер компонента.

🟠При создании data класса Kotlin автоматически создает функции componentN() для каждого свойства класса, где N — номер позиции переменной в конструкторе. Функции componentN() возвращают значения свойств в порядке их объявления в конструкторе. Это позволяет использовать мульти-декларации для распаковки значений свойств и присваивания их отдельным переменным.

Например, если у нас есть data класс Person с двумя свойствами name и age, мы можем использовать мульти-декларации, чтобы извлечь эти свойства и присвоить их двум переменным:

data class Person(val name: String, val age: Int)

val person = Person("Alice", 29)
val (name, age) = person

println(name) // Alice
println(age) // 29

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


val people = listOf(Person("Alice", 30), Person("Bob", 40))
for ((name, age) in people) {
println("$name is $age years old")
}

// Alice is 30 years old
// Bob is 40 years old


Мульти-декларации также могут быть использованы с массивами и другими коллекциями:

val list = listOf("apple", "banana", "orange")
val (first, second, third) = list

println(first) // apple
println(second) // banana
println(third) // orange


👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#ЧеКак
🤔 Как происходит составление хешмапы, если совпадает хеш-код?

Если два ключа имеют одинаковый хеш-код (коллизия), используются механизмы разрешения:
🟠Связанные списки (chaining): элементы с одинаковым хешем помещаются в один bucket в виде связанного списка.
🟠Сбалансированные деревья: современные реализации (например, в Java) используют деревья вместо списков для ускорения поиска при большом количестве коллизий.
🟠Метод equals используется для проверки уникальности ключей в случае совпадения хеша.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Как в Kotlin создать список, который автоматически удаляет дубликаты при добавлении элементов?
Anonymous Quiz
0%
Использовать listOf()
25%
Использовать mutableListOf()
67%
Использовать setOf()
8%
Использовать linkedSetOf()
#полезное
👨‍💻 Гибрид двух легендарных игр

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

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Что происходит при использовании lateinit с переменной, которая не была инициализирована перед её использованием?
Anonymous Quiz
18%
Возвращается значение по умолчанию
64%
Генерируется исключение UninitializedPropertyAccessException
9%
Программа завершается с ошибкой сегментации
9%
Компилятор выдаст предупреждение
#ЛитКод
Задача: 632. Smallest Range Covering Elements from K Lists

У вас есть k списков отсортированных целых чисел в неубывающем порядке. Найдите наименьший диапазон, в который входит хотя бы одно число из каждого из k списков. Мы определяем, что диапазон [a, b] меньше диапазона [c, d], если b - a < d - c или a < c, если b - a == d - c.

Пример:
Input: nums = [[4,10,15,24,26],[0,9,12,20],[5,18,22,30]]
Output: [20,24]


👨‍💻 Алгоритм:

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

2⃣Нахождение минимального диапазона
Используйте кучу для извлечения минимального элемента и обновления текущего диапазона. Обновляйте максимальный элемент в текущем диапазоне при добавлении новых элементов.

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

😎 Решение:
import java.util.PriorityQueue

data class Element(val value: Int, val row: Int, val col: Int)

class Solution {
fun smallestRange(nums: List<List<Int>>): IntArray {
val minHeap = PriorityQueue<Element> { a, b -> a.value - b.value }
var maxValue = Int.MIN_VALUE

for (i in nums.indices) {
minHeap.add(Element(nums[i][0], i, 0))
maxValue = maxOf(maxValue, nums[i][0])
}

var rangeStart = 0
var rangeEnd = Int.MAX_VALUE

while (minHeap.size == nums.size) {
val minElement = minHeap.poll()
if (maxValue - minElement.value < rangeEnd - rangeStart) {
rangeStart = minElement.value
rangeEnd = maxValue
}

if (minElement.col + 1 < nums[minElement.row].size) {
val value = nums[minElement.row][minElement.col + 1]
minHeap.add(Element(value, minElement.row, minElement.col + 1))
maxValue = maxOf(maxValue, value)
}
}

return intArrayOf(rangeStart, rangeEnd)
}
}


👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
#Собес
🤔 Расскажи про анонимные классы и объекты, object u companion object

Анонимные классы в Kotlin создаются с использованием ключевого слова object и не требуют явного обьявления. Они реализуют интерфейсы или наследуют классы и могут использоваться для одноразовых целей. object в Kotlin также используется для объявления объектов-синглтонов (object declaration) и для создания объектов внутри классов (companion object), которые действуют как статические поля.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
🤔 В Kotlin, как преобразовать список строк в список их длин?
Anonymous Quiz
57%
list.map { it.length }
13%
list.convert { String -> Int }
17%
list.lengths()
13%
list.collect { it.length }
❤1
This media is not supported in your browser
VIEW IN TELEGRAM
#Полезное
👩‍💻 Android представил свою новую функцию RCS!

RCS (Rich Communication Services) — это стандарт для обмена сообщениями, который улучшает SMS и MMS, предоставляя пользователям более расширенные возможности, такие как передача медиафайлов высокого качества, поддержка групповых чатов, обмен реакциями на сообщения и подтверждения доставки.

Основные особенности RCS:

🟠Обогащенные сообщения: Возможность отправлять текстовые сообщения с вложениями, такими как фотографии, видео и документы, а также поддержка взаимодействий с картами и стикерами.

🟠 Групповые чаты и подтверждения: Поддержка групповых чатов с улучшенными функциями, включая подтверждения о доставке и прочтении сообщений.

🟠 Интеграция с интернетом: В отличие от стандартных SMS и MMS, сообщения RCS отправляются через интернет, что позволяет улучшить качество связи и снизить затраты на обмен сообщениями.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4❤2
#Вакансии
👨‍💻 Kotlin разработчик

Локация: Удаленно
Компания: YARUS
ЗП: от 1 500 до 2 500 $
Занятость: Частичная/Проектная
Город и адрес офиса: Санкт-Петербург

Kotlin – разработчик со опытом CI/CD в GitLab. B2B сегмент, готовый продукт с тестами и CICD, надо дотюнить CI/CD в GitLab (перевод на новые тесты) + пилить новые фичи (опыт работы с SDK Zebra, Honeywell желательно), апа под ТСД. Текущий разработчик проконсультирует, есть качественная дока, НЕ легаси.

🚩Требования
🔵Опыт работы в разработке от 3х лет
🔵Опыт работы с мобильной фермой (STF или аналог), SonarQube
🔵Практические знания архитектурных паттернов (MVC, MVP, MVVM, MVI)
🔵Опыт работы с SDK, Jetpack Compose, Retrofit
🔵Наличие репрезентативного pet-проекта или прод-проекта с целью демонстрации тех. скиллов обязательно

💬 Резюме отправлять: @yarus_y

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
#Собес
🤔 Чем Kotlin отличается от Java?

Kotlin и Java оба работают на JVM, но Kotlin предлагает более компактный и читаемый синтаксис. В нем встроены функции безопасности для null-ссылок, что помогает избежать типичных ошибок. Kotlin также поддерживает более современные возможности, такие как корутины для асинхронного программирования и функции расширения, чего нет в Java.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
#полезное
😊 Koin — это лёгкий и прагматичный фреймворк для внедрения зависимостей (Dependency Injection) на языке Kotlin!

🟠Он поддерживает как Kotlin Multiplatform, так и Android. Koin предоставляет удобный DSL для настройки зависимостей, минимизирует избыточность кода и интегрируется с различными экосистемами, включая Jetpack Compose и Ktor.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
#ЛитКод
Задача: 634. Find the Derangement of An Array

В комбинаторной математике отклонение - это перестановка элементов множества таким образом, что ни один элемент не оказывается на прежнем месте. Вам дано целое число n. Изначально имеется массив, состоящий из n целых чисел от 1 до n в порядке возрастания, верните количество отклонений, которые он может породить. Поскольку ответ может быть огромным, верните его по модулю 109 + 7.

Пример:
Input: n = 3
Output: 2


👨‍💻 Алгоритм:

1⃣Инициализация массива для хранения результатов
Создайте массив dp для хранения количества отклонений для каждого значения от 0 до n. Установите начальные значения: dp[0] = 1 и dp[1] = 0.

2⃣Вычисление количества отклонений
Используйте динамическое программирование для вычисления количества отклонений для каждого значения от 2 до n. Формула для вычисления: dp[i] = (i - 1) * (dp[i - 1] + dp[i - 2]) % MOD.

3⃣Возвращение результата
Верните значение dp[n], которое будет количеством отклонений для n элементов, по модулю 10^9 + 7.

😎 Решение:
class Solution {
fun countDerangements(n: Int): Int {
val MOD = 1_000_000_007
if (n == 0) return 1
if (n == 1) return 0
val dp = IntArray(n + 1)
dp[0] = 1
dp[1] = 0
for (i in 2..n) {
dp[i] = ((i - 1) * (dp[i - 1] + dp[i - 2].toLong()) % MOD).toInt()
}
return dp[n]
}
}


👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1👍1
#Собес
🤔 Какие основные типы данных в Kotlin?

В Kotlin есть несколько основных типов данных:
🟠Числа: Int (целые числа), Double (двойной точности числа с плавающей запятой), Float (одинарной точности), Long (длинные целые числа), Short (короткие целые числа) и Byte (байты).

🟠Булевы значения: Тип Boolean , который может быть либо true , либо false .

🟠Символы: Тип Char для одного символа.

🟠Строки: Тип String для последовательности символов.

👉Новости 👉Платформа
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1