Kotlin | Вопросы собесов
2.57K subscribers
28 photos
964 links
Download Telegram
🤔 Можно ли на уровне компилятора сделать все функции inline?

Нет, не все функции можно сделать на уровне компилятора:
1. Компилятор принимает решение на основе размера функции и оптимизации производительности.
2. Рекурсивные функции или сложные конструкции не могут быть встроены, так как это может вызвать ошибки или увеличенный размер кода.
3. Принудительное использование inline директив возможно, но это не всегда эффективно.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2😁2
🤔 Когда инициализируется companion object?

В Kotlin, companion object (объект-компаньон) используется для создания статических членов класса. Этот объект инициализируется при первом доступе к нему.

🚩Особенности инициализации `companion object`

🟠Ленивая инициализация
companion object инициализируется лениво, то есть при первом обращении к любому из его членов. Это помогает избежать ненужных затрат ресурсов до тех пор, пока эти члены не понадобятся.

🟠Статическая инициализация
По сути, companion object работает как статический объект в Java, предоставляя статические методы и свойства.

Пример использования
class MyClass {
companion object {
val staticProperty: String = "Hello, World!"

fun staticMethod() {
println("Static Method Called")
}

init {
println("Companion object is initialized")
}
}
}


Пример инициализации
fun main() {
println("Before accessing companion object")

// Первое обращение к companion object
println(MyClass.staticProperty)

// Еще одно обращение к companion object
MyClass.staticMethod()
}


Вывод программы
Before accessing companion object
Companion object is initialized
Hello, World!
Static Method Called


🚩Дополнительные особенности

🟠Может иметь имя
companion object можно называть, что позволяет иметь несколько объектов-компаньонов в одном классе, хотя это редко используется.
class MyClass {
companion object NamedCompanion {
// Члены и методы
}
}


🟠Реализация интерфейсов
companion object может реализовывать интерфейсы.
interface MyInterface {
fun doSomething()
}

class MyClass {
companion object : MyInterface {
override fun doSomething() {
println("Doing something")
}
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
🤔Как отловить самую раннюю точку захода в приложение?

1. Для Android точка входа — это метод onCreate класса Application. Его можно переопределить для выполнения начальной логики.
2. В некоторых случаях может понадобиться использование ContentProvider, который инициализируется до Application.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2🤯1
🤔 Какие базы данных можно использовать в Android?

В Android приложениях можно использовать различные базы данных для хранения данных.

🟠SQLite
Является встроенной реляционной базой данных, которая поставляется вместе с Android. Это легковесная база данных, не требующая настройки сервера.

Плюсы и минусы
Легковесность и встроенность в Android.
Поддержка большинства SQL-операций.
Простота использования через API.
Ограниченные возможности по сравнению с полноценными СУБД.
Требует написания SQL-запросов вручную.

public class MyDatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "mydatabase.db";
private static final int DATABASE_VERSION = 1;

public MyDatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE mytable (id INTEGER PRIMARY KEY, name TEXT)");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS mytable");
onCreate(db);
}
}


🟠Room
Это библиотека, предоставляющая слой абстракции поверх SQLite. Она облегчает работу с базой данных, предоставляя удобный API и поддержку проверки запросов во время компиляции.

Плюсы и минусы
Простота использования и настройка.
Поддержка проверки запросов во время компиляции.
Интеграция с LiveData и RxJava.
Требует добавления зависимости и конфигурации.

Пример использования
@Entity
public class User {
@PrimaryKey
public int uid;
public String firstName;
public String lastName;
}

@Dao
public interface UserDao {
@Query("SELECT * FROM user")
List<User> getAll();

@Insert
void insertAll(User... users);
}

@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}


🟠Realm
Это современная база данных, созданная специально для мобильных приложений. Она имеет собственный движок и API, отличное от традиционных реляционных баз данных.

Плюсы и минусы
Высокая производительность.
Простота использования и установка.
Реактивные обновления данных.
Больший размер библиотеки.
Ограниченная поддержка некоторых SQL-функций.

Пример использования
public class User extends RealmObject {
@PrimaryKey
private int id;
private String name;

// getters and setters
}

// Использование
Realm realm = Realm.getDefaultInstance();
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
User user = realm.createObject(User.class, 1);
user.setName("John Doe");
}
});


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 Что можно положить в Bundle?

Можно передавать примитивные типы данных и сериализуемые объекты:
1. Примитивы: int, float, boolean, double.
2. Строки и массивы примитивов.
3. Сериализуемые или Parcelable объекты.
4. Для больших данных, например, файлов, лучше использовать ссылки или путь к данным.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1
🤔 Как работает стек?

Это абстрактная структура данных, работающая по принципу "последний вошел — первый вышел" (LIFO, Last In First Out). Это означает, что последний добавленный элемент будет первым, который будет удален.

🟠push
добавление элемента на вершину стека.
🟠pop
удаление элемента с вершины стека.

🚩Принцип работы стека

🟠push(item)
добавляет элемент item на вершину стека.
🟠pop()
удаляет и возвращает элемент с вершины стека.
🟠peek()
возвращает элемент на вершине стека, но не удаляет его.
🟠isEmpty()
проверяет, пуст ли стек.
🟠size()
возвращает количество элементов в стеке.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🤔 Как правильно передать большой объем данных, например, картинку, в Activity?

1. Вместо передачи данных через Intent или Bundle, сохраняйте данные в файловую систему, кэш или базу данных.
2. Передавайте только ссылку (путь) на данные.
3. Используйте механизмы, такие как URI или ContentProvider, для безопасного доступа к большим данным. Это предотвратит ошибки превышения размера данных в Intent.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥2
🤔 Какие есть ограничения у sealed классов?

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

🚩Ограничения sealed классов

🟠Все подтипы должны быть определены в том же файле
Все классы, которые наследуются от sealed класса, должны быть определены в одном файле с самим sealed классом. Это ограничение введено для обеспечения полной контрольной иерархии и предотвращения добавления новых подтипов в другом месте.
sealed class Result {
class Success(val data: String) : Result()
class Error(val exception: Exception) : Result()
}


🟠Sealed класс не может быть интерфейсом
Sealed класс не может быть интерфейсом. Если вам нужно определить ограниченную иерархию интерфейсов, вы должны использовать обычные интерфейсы и sealed классы вместе.

🟠Sealed класс не может быть абстрактным классом напрямую
Хотя sealed классы и являются абстрактными по своей природе (их нельзя напрямую инстанцировать), они не могут быть явно помечены как abstract.

🟠Ограничение видимости
Sealed классы и их подтипы не могут быть private. Они должны быть либо public, либо internal, чтобы их можно было использовать в рамках всего файла иерархии.

🟠Sealed классы не поддерживают наследование от других классов
Sealed класс не может наследоваться от другого класса, кроме Any. Это связано с тем, что sealed классы уже имеют специфическое предназначение и их иерархия должна быть полностью определена в одном месте.

🟠Могут использоваться только для классов и объектов, но не интерфейсов
Sealed классы могут быть использованы для классов и объектов, но не могут использоваться для определения интерфейсов.

sealed class Operation {
class Addition(val value: Int) : Operation()
class Subtraction(val value: Int) : Operation()
object NoOp : Operation()
}

fun execute(operation: Operation, base: Int): Int {
return when (operation) {
is Operation.Addition -> base + operation.value
is Operation.Subtraction -> base - operation.value
Operation.NoOp -> base
}
}


🚩Плюсы

Компилятор знает все подтипы
Это позволяет использовать исчерпывающие выражения when, которые не требуют блока else, если все подтипы покрыты.
Полный контроль над иерархией классов
Это делает код более предсказуемым и безопасным.
Поддержка сопоставления с образцом (pattern matching)
Это делает код более читаемым и менее подверженным ошибкам.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥2
🤔 Зачем нужен `reified`?

reified используется с inline-функциями в Kotlin для сохранения типа во время выполнения, что позволяет работать с типами без явного указания Class<T>.
1. Это нужно, чтобы избегать рефлексии и писать более читаемый код.
2. Пример: фильтрация элементов коллекции по типу list.filterIsInstance<T>().


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍2
🤔 Что при создании классов в Kotlin изменились по сравнению с Java?

При создании классов по сравнению с Java произошли несколько значительных изменений и упрощений. Kotlin предлагает более лаконичный и выразительный синтаксис, что делает код более читаемым и удобным.

🚩Объявление классов и конструкторов

В Kotlin объявление классов и их конструкторов значительно упрощено.
В Java
public class Person {
private String name;
private int age;

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

public String getName() {
return name;
}

public int getAge() {
return age;
}
}


В Kotlin
class Person(val name: String, val age: Int)


🟠Статические члены
В Java для объявления статических членов используется ключевое слово static. В Kotlin вместо этого используются companion object.
В Java
public class MyClass {
public static final String CONSTANT = "constant";

public static void staticMethod() {
// Some code
}
}


В Kotlin
class MyClass {
companion object {
const val CONSTANT = "constant"

@JvmStatic
fun staticMethod() {
// Some code
}
}
}


🟠Data классы
Kotlin предоставляет специальный тип классов — data классы, которые автоматически генерируют методы equals(), hashCode(), toString(), copy(), и componentN().
В Java
public class User {
private String name;
private int age;

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

@Override
public boolean equals(Object o) {
// Implementation
}

@Override
public int hashCode() {
// Implementation
}

@Override
public String toString() {
// Implementation
}
}


В Kotlin
data class User(val name: String, val age: Int)


🟠Свойства и методы доступа
В Kotlin свойства объявляются напрямую, и методы доступа (геттеры и сеттеры) генерируются автоматически.
В Java
public class Rectangle {
private int width;
private int height;

public int getWidth() {
return width;
}

public void setWidth(int width) {
this.width = width;
}

public int getHeight() {
return height;
}

public void setHeight(int height) {
this.height = height;
}
}


В Kotlin
class Rectangle(var width: Int, var height: Int)


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 Что известно о спец. типах?

1. Unit: аналог void, но используется как возвращаемый тип функций.
2. Nothing: указывает, что функция никогда не завершится успешно (например, выбрасывает исключение).
3. Any: корневой тип для всех объектов в Kotlin.
4. Nullable типы: добавляют ?, чтобы разрешить null в значении.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥3
🤔 Что происходит с полями из супер-класса при наследовании data-класса?

При наследовании data class от какого-либо суперкласса в Kotlin, важно понимать, как работают свойства (поля) суперкласса и как они влияют на функциональность и структуру data class.

🚩Что происходит с полями суперкласса

🟠Наследование свойств
Поля (свойства), объявленные в суперклассе, автоматически становятся доступными в классе-наследнике. Вы можете использовать их в наследуемом классе как обычно. Однако свойства суперкласса не участвуют в автоматически сгенерированных функциях equals(), hashCode(), и toString() для data class.

🟠Автоматически сгенерированные функции в data-классе
У data class Kotlin генерирует функции equals(), hashCode(), toString(), copy() и другие. Эти функции работают только с параметрами, объявленными в первичном конструкторе data-класса. Поля, которые находятся в суперклассе, не участвуют в этих функциях.

🟠Почему поля суперкласса игнорируются
Это связано с тем, что контракт data class предполагает, что все его ключевые данные (data) определяются только параметрами первичного конструктора. Это позволяет гарантировать, что две одинаковые сущности будут сравниваться и обрабатываться корректно, основываясь только на данных самого data class.

// Суперкласс с полем name
open class Person(val name: String)

// Наследуемый data-класс
data class Employee(val id: Int, val position: String) : Person(name = "Default")


val employee1 = Employee(1, "Developer")
val employee2 = Employee(1, "Developer")

println(employee1 == employee2) // true, так как сравнение основано только на id и position
println(employee1.toString()) // Employee(id=1, position=Developer)


🟠Если нужно включить поля суперкласса в сравнение
Если вы хотите, чтобы поля суперкласса учитывались в логике equals() или hashCode(), вам нужно переопределить эти функции вручную.
data class Employee(val id: Int, val position: String) : Person(name = "Default") {
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (other !is Employee || !super.equals(other)) return false
return id == other.id && position == other.position && name == other.name
}

override fun hashCode(): Int {
return 31 * super.hashCode() + id.hashCode() + position.hashCode()
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14
🤔 Что объединяет основные компоненты Android-приложения?

Все компоненты Android (Activity, Service, BroadcastReceiver, ContentProvider) управляются системой через Context.
1. Они взаимодействуют через Intent, который передаёт команды и данные.
2. Каждый компонент регистрируется в AndroidManifest.xml.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍7
🤔 В чём отличие андроид 7 и 8?

Различия между Android 7 (Nougat) и Android 8 (Oreo) заключаются в добавленных функциях, изменениях в производительности, безопасности, работе приложений и пользовательском интерфейсе.

🚩Основные отличия Android 7 и Android 8

🟠Производительность и оптимизация
Android 7 (Nougat):
Впервые представлена технология Doze on the Go, которая снижает энергопотребление приложений, когда устройство неактивно.
Улучшена многозадачность благодаря Split-Screen Mode (режим разделения экрана).
Android 8 (Oreo):
Введена система Vitals, которая отслеживает поведение приложений и оптимизирует их производительность, снижая потребление батареи и ресурсов.
Фоновое ограничение (Background Limits): приложения, работающие в фоновом режиме, имеют жёсткие ограничения на использование ресурсов (например, CPU и батареи).

🟠Новые функции в пользовательском интерфейсе
Android 7 (Nougat):
Режим разделения экрана (Split-Screen): позволяет одновременно запускать два приложения. Быстрая смена между последними приложениями через двойное нажатие кнопки недавних задач.
Android 8 (Oreo):
Картинка в картинке (Picture-in-Picture): возможность сворачивать видео или навигационные приложения в маленькое окно, которое остается поверх других приложений.
Уведомления стали более функциональными: появились каналы уведомлений (Notification Channels), позволяющие группировать и настраивать уведомления от приложений.
Уведомления с задержкой: появилось возможность откладывать уведомления на некоторое время (Snooze).

🟠Скорость загрузки и работа приложений
Android 7 (Nougat):
Улучшения в системе ART (Android Runtime) позволили ускорить запуск приложений по сравнению с предыдущими версиями.
Android 8 (Oreo):
Добавлена функция Instant Apps: позволяет использовать приложения без их предварительной установки.
Приложения запускаются быстрее благодаря оптимизациям ART и сокращению кода, который нужно интерпретировать при старте.

🟠Безопасность
Android 7 (Nougat):
Впервые введена функция Direct Boot, позволяющая приложениям выполнять задачи (например, будильник или приём SMS) до ввода PIN-кода.
Android 8 (Oreo):
Представлен Google Play Protect — система защиты, которая сканирует приложения на наличие вредоносного кода.
Улучшена безопасность установки приложений из сторонних источников: теперь каждое приложение требует отдельного разрешения на установку.
Укрепление работы шифрования.

🟠Медиа и графика
Android 7 (Nougat): Поддержка новых API для работы с графикой, таких как Vulkan API для улучшения производительности в играх.
Android 8 (Oreo):
Новый формат LDAC для передачи высококачественного звука через Bluetooth (например, для беспроводных наушников).
Поддержка Wide Color Gamut для улучшения отображения цветов на экранах с расширенным динамическим диапазоном (HDR).

🟠Работа с уведомлениями
Android 7 (Nougat):
Уведомления стали интерактивными, добавлена возможность ответа прямо из уведомления.
Поддержка группировки уведомлений.
Android 8 (Oreo):
Каналы уведомлений: теперь можно настроить типы уведомлений, которые вы хотите получать от приложения (например, отключить уведомления о рекламных акциях, оставив только важные).
Добавлена возможность временного откладывания уведомлений (Snooze).

🟠Дополнительные улучшения
Android 7 (Nougat):
Поддержка многоязычия: возможность выбрать несколько языков одновременно.
Android 8 (Oreo):
Автоматическое заполнение форм (Autofill): помогает автоматически заполнять пароли и другую информацию в приложениях.
Обои адаптируются под светлую или тёмную тему интерфейса.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍2
🤔 Сервис может коммуницировать с пользователем?

Сервис напрямую не взаимодействует с пользователем, так как он работает в фоновом режиме.
Однако он может отправлять уведомления или использовать BroadcastReceiver для передачи информации Activity.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1
🤔 В чём отличие Dalvik Virtual Machine и ART(Android Run Time)?

Dalvik Virtual Machine (DVM) и Android Runtime (ART) — это две среды выполнения для запуска Android-приложений. DVM использовалась в ранних версиях Android, в то время как ART пришла на замену DVM, начиная с Android 5.0 (Lollipop). Основное различие между ними заключается в способе выполнения кода и производительности.

🚩Основные отличия между Dalvik и ART

🟠Тип выполнения кода
Dalvik Virtual Machine (DVM): Just-In-Time (JIT) компиляция
Dalvik использует JIT-компиляцию (Just-In-Time), что означает, что код приложения компилируется в машинный код во время выполнения (runtime).
Когда приложение запускается, DVM интерпретирует байт-код (.dex-файлы), а при необходимости компилирует часть кода "на лету" для повышения производительности.
Этот подход требует дополнительных ресурсов во время работы приложения, что увеличивает задержки (лаг) при запуске и потребляет больше CPU и батареи.
ART использует AOT-компиляцию (Ahead-Of-Time), которая компилирует весь код приложения в машинный код заранее — во время установки приложения.
Это устраняет необходимость интерпретации и JIT-компиляции во время работы приложения, что снижает нагрузку на процессор и улучшает производительность.

🟠Производительность
Dalvik (DVM):
Поскольку JIT-компиляция происходит во время работы приложения, это создает дополнительную нагрузку на процессор и замедляет выполнение.
Производительность ниже из-за частой интерпретации кода.
ART:
Благодаря AOT-компиляции приложения запускаются быстрее и работают плавнее.
Потребление ресурсов (CPU, батарея) значительно ниже, поскольку интерпретация и компиляция кода уже выполнены на этапе установки.

🟠Ускорение запуска приложений
Dalvik (DVM):
Приложения запускаются медленнее, так как DVM интерпретирует код во время каждого запуска.
ART:
Приложения запускаются быстрее, так как код уже компилирован в машинный код на этапе установки.

🟠Потребление батареи
Dalvik (DVM):
Потребляет больше батареи из-за того, что JIT-компиляция выполняется постоянно во время работы приложения.
ART:
Более энергоэффективен, так как большая часть работы выполнена заранее, и процессор не нагружается так сильно.

🟠Время установки приложения
Dalvik (DVM):
Приложения устанавливаются быстрее, так как код не компилируется заранее.
ART:
Приложения устанавливаются медленнее, так как на этапе установки выполняется AOT-компиляция.
Например, установка приложения в ART может занимать больше времени, чем в DVM, из-за компиляции кода.

🟠Память
Dalvik (DVM):
DVM использует меньше памяти на устройстве, так как код компилируется только во время работы приложения, и машинный код не сохраняется.
ART:
AOT-компиляция увеличивает размер приложения, так как компилированный машинный код сохраняется на устройстве. Это требует больше места в памяти.

🟠Отладка и инструменты
Dalvik (DVM):
Ограниченные возможности отладки, так как JIT-компиляция не предоставляет доступа к заранее оптимизированному коду.
ART:
ART позволяет разработчикам использовать более продвинутые инструменты отладки (например, профилирование исполнения) и лучше анализировать производительность приложений.

🟠Совместимость
Dalvik (DVM):
Dalvik был изначально разработан для устройств с ограниченными ресурсами (медленные процессоры, малый объем оперативной памяти).
Приложения работали в основном в условиях ограниченного оборудования.
ART:
ART ориентирован на современные устройства с мощными процессорами и большим объемом памяти.
Он лучше справляется с современными требованиями приложений.

🚩Пример различий

🟠На Dalvik (DVM):
- Установка быстрая.
- При запуске приложения DVM интерпретирует и компилирует код. Это требует времени и ресурсов.
- Приложение может работать медленно из-за интерпретации кода в реальном времени.
🟠На ART:
- Установка занимает больше времени, так как код компилируется сразу.
- Запуск приложения быстрый, потому что код уже готов к исполнению.
- Приложение работает плавно, так как отсутствует необходимость компиляции во время выполнения.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍113
🤔 Можно ли поднять приоритет процесса?

Да, можно, например, через использование startForeground в сервисах.
1. Это позволяет сервису работать как foreground, обеспечивая его приоритетное выполнение.
2. Но такие действия требуют отображения уведомлений, что может раздражать пользователей.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6
🤔 С помощью чего делается переход со списков на деталки?

Переход от списка (например, списка элементов в RecyclerView) к экрану деталей элемента в Android является очень распространённой задачей. Для реализации таких переходов используются Intent, Bundle, ViewModel, а также инструменты навигации, такие как Navigation Component.

🟠Переход с использованием Intent и Bundle
Это базовый способ передачи данных от одного экрана (активности) к другому.
1. При нажатии на элемент списка (RecyclerView) создается Intent.
2. В Intent передаются данные (например, ID элемента или вся информация в виде Parcelable или Serializable объекта).
3. Новый экран (деталка) запускается с помощью метода startActivity(intent).
4. На экране детализации данные извлекаются из Intent.
// Предположим, что в адаптере RecyclerView вы обрабатываете клик на элементе
val intent = Intent(this, DetailActivity::class.java)
// Передаем ID элемента через Intent
intent.putExtra("ITEM_ID", item.id)
startActivity(intent)


Деталка (DetailActivity)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_detail)

// Получаем данные из Intent
val itemId = intent.getIntExtra("ITEM_ID", -1)

// Используем itemId, чтобы загрузить данные о выбранном элементе
loadItemDetails(itemId)
}

fun loadItemDetails(id: Int) {
// Например, загрузка из базы данных или сети
}


🟠Переход с использованием Navigation Component
Navigation Component — это современный способ управления переходами между экранами в Android. Он значительно упрощает реализацию навигации и передачи данных.
1. Вы создаете граф навигации (nav_graph), где определяете все экраны (фрагменты) и связи между ними.
2. Переходы между экранами задаются как действия (actions) внутри графа.
3. Данные передаются через аргументы (arguments), которые указываются в nav_graph.

1⃣Настройка nav_graph (res/navigation/nav_graph.xml)
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="https://schemas.android.com/apk/res/android"
app:startDestination="@id/listFragment">

<fragment
android:id="@+id/listFragment"
android:name="com.example.ListFragment"
android:label="Список" >
<action
android:id="@+id/action_listFragment_to_detailFragment"
app:destination="@id/detailFragment" />
</fragment>

<fragment
android:id="@+id/detailFragment"
android:name="com.example.DetailFragment"
android:label="Детали" >
<argument
android:name="itemId"
app:argType="integer" />
</fragment>

</navigation>


2⃣Переход из списка (ListFragment)
val action = ListFragmentDirections.actionListFragmentToDetailFragment(itemId = 123)
findNavController().navigate(action)


3⃣Получение аргумента в деталке (DetailFragment)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

// Получаем аргумент, переданный через Navigation Component
val itemId = arguments?.getInt("itemId") ?: -1

// Используем itemId для загрузки деталей
loadItemDetails(itemId)
}


Ставь
👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
🤔 С чем связаны ограничения на запуск сервисов?

Ограничения связаны с оптимизацией энергопотребления и производительности.
1. Android блокирует запуск долгоживущих сервисов в фоне на новых версиях, чтобы избежать утечек памяти и энергозатрат.
2. Для обхода ограничений используют WorkManager или foreground-сервисы.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2
🤔 В каком потоке запускается самый обычный сервис?

Самый обычный сервис, который наследуется от класса Service, по умолчанию запускается в главном потоке приложения, который также называется UI-потоком (User Interface Thread). Это означает, что все операции, выполняемые в сервисе, включая методы onStartCommand(), onCreate(), и onBind(), выполняются в главном потоке. Если в сервисе будут выполняться длительные или ресурсоемкие операции, такие как сетевые запросы, обработка больших данных или выполнение сложных вычислений, это может привести к "зависанию" пользовательского интерфейса и появлению сообщений о том, что приложение не отвечает (ANR — Application Not Responding).

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6