Выбор Android-разработки предоставляет целый ряд преимуществ, как для разработчиков, так и для бизнеса.
Является самой популярной мобильной операционной системой в мире, что обеспечивает доступ к широкой аудитории. Приложения могут достичь значительного числа пользователей по всему миру, увеличивая потенциальные рыночные возможности.
Предоставляет больше гибкости в плане настройки приложений и интеграции с операционной системой. Это открытая платформа, что позволяет экспериментировать и внедрять новшества с меньшим количеством ограничений по сравнению с другими операционными системами.
Предоставляют разработчикам мощные инструменты для создания, тестирования и отладки приложений. Kotlin, который стал основным для Android-разработки, предлагает современные возможности и улучшает производительность и читаемость кода по сравнению с Java.
Работает на множестве устройств с различными размерами экрана и характеристиками, что дает возможность охватить более широкий спектр рынка. Однако это также создает вызовы, связанные с адаптацией приложений под разные устройства.
Тесно интегрирован с Google Services, такими как Google Drive, Google Maps и другими. Это предоставляет легкий доступ к мощным инструментам и API, которые могут значительно расширить функциональность приложений.
Приложения можно распространять не только через Google Play Market. Существуют альтернативные магазины приложений и платформы, что предоставляет больше вариантов монетизации и распространения своих продуктов.
Имеет одно из самых больших сообществ разработчиков, что означает обширную поддержку, большое количество ресурсов, форумов, блогов и документации, которые могут помочь новым и опытным разработчикам.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥3
В Android передача данных между Activity осуществляется через механизм Intent. Intent — это объект, который позволяет передавать данные и запускать компоненты, такие как Activity, Service и BroadcastReceiver.
В первой Activity создайте Intent и добавьте данные, которые хотите передать, используя методы
putExtra.// MainActivity.java
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("key", "value"); // передаем строку
intent.putExtra("number", 123); // передаем целое число
startActivity(intent);
Во второй 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. Этот интерфейс позволяет сериализовать объекты для передачи через Intent.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 (если нужны)
}
// MainActivity.java
User user = new User("John", 30);
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("user", user);
startActivity(intent);
// 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
👍5❤1
1. Связанные списки (chaining): элементы с одинаковым хешем помещаются в один bucket в виде связанного списка.
2. Сбалансированные деревья: современные реализации (например, в Java) используют деревья вместо списков для ускорения поиска при большом количестве коллизий.
3. Метод equals используется для проверки уникальности ключей в случае совпадения хеша.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2
Это популярная библиотека для внедрения зависимостей в Java и Android приложениях. Инжект в поле при помощи Dagger позволяет автоматически управлять зависимостями, что упрощает код и делает его более чистым и удобным для тестирования.
Dagger автоматически управляет созданием и предоставлением экземпляров зависимостей, что упрощает и улучшает структуру кода.
Использование Dagger позволяет избежать написания большого количества шаблонного кода, связанного с созданием и управлением зависимостями вручную.
Dagger поддерживает различные области видимости (например,
@Singleton), что позволяет контролировать жизненный цикл зависимостей.Внедрение зависимостей через Dagger упрощает тестирование кода, так как зависимости можно легко замокать (заменить на тестовые версии).
@Inject для полей, в которые нужно внедрить зависимости.import dagger.Module;
import dagger.Provides;
@Module
public class NetworkModule {
@Provides
@Singleton
public NetworkService provideNetworkService() {
return new NetworkServiceImpl();
}
}
import dagger.Component;
import javax.inject.Singleton;
@Singleton
@Component(modules = {NetworkModule.class})
public interface AppComponent {
void inject(MainActivity mainActivity);
}
import javax.inject.Inject;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
@Inject
NetworkService networkService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Получение компонента и инжект зависимостей
((MyApplication) getApplication()).getAppComponent().inject(this);
// Теперь networkService можно использовать
networkService.performRequest();
}
}
import android.app.Application;
public class MyApplication extends Application {
private AppComponent appComponent;
@Override
public void onCreate() {
super.onCreate();
// Создание Dagger-компонента
appComponent = DaggerAppComponent.builder()
.networkModule(new NetworkModule())
.build();
}
public AppComponent getAppComponent() {
return appComponent;
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
1. Компилятор принимает решение на основе размера функции и оптимизации производительности.
2. Рекурсивные функции или сложные конструкции не могут быть встроены, так как это может вызвать ошибки или увеличенный размер кода.
3. Принудительное использование inline директив возможно, но это не всегда эффективно.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2😁2
В Kotlin,
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
2. В некоторых случаях может понадобиться использование ContentProvider, который инициализируется до Application.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2🤯1
В Android приложениях можно использовать различные базы данных для хранения данных.
Является встроенной реляционной базой данных, которая поставляется вместе с Android. Это легковесная база данных, не требующая настройки сервера.
Плюсы и минусы
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);
}
}Это библиотека, предоставляющая слой абстракции поверх SQLite. Она облегчает работу с базой данных, предоставляя удобный API и поддержку проверки запросов во время компиляции.
Плюсы и минусы
Пример использования
@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();
}
Это современная база данных, созданная специально для мобильных приложений. Она имеет собственный движок и API, отличное от традиционных реляционных баз данных.
Плюсы и минусы
Пример использования
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
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). Это означает, что последний добавленный элемент будет первым, который будет удален.
добавление элемента на вершину стека.
удаление элемента с вершины стека.
добавляет элемент
item на вершину стека.удаляет и возвращает элемент с вершины стека.
возвращает элемент на вершине стека, но не удаляет его.
проверяет, пуст ли стек.
возвращает количество элементов в стеке.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Forwarded from easyoffer
easyoffer
Backend
Python | Вопросы
Python | Удалёнка
Python | LeetCode
Python | Тесты
Frontend | Вопросы
Frontend | Удалёнка
JavaScript | LeetCode
Frontend | Тесты
Java | Вопросы
Java | Удалёнка
Java | LeetCode
Java | Тесты
Тестировщик | Вопросы
Тестировщик | Удалёнка
Тестировщик | Тесты
Data Science | Вопросы
Data Science | Удалёнка
Data Science | Тесты
C# | Вопросы
C# | Удалёнка
C# | LeetCode
C# | Тесты
C/C++ | Вопросы
C/C++ | Удалёнка
C/C++ | LeetCode
C/C++ | Тесты
Golang | Вопросы
Golang | Удалёнка
Golang | LeetCode
Golang | Тесты
DevOps | Вопросы
DevOps | Удалёнка
DevOps | Тесты
PHP | Вопросы
PHP | Удалёнка
PHP | LeetCode
PHP | Тесты
Kotlin | Вопросы
Kotlin | Удалёнка
Kotlin | LeetCode
Kotlin | Тесты
Swift | Вопросы
Swift | Удалёнка
Swift | LeetCode
Swift | Тесты
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
2. Передавайте только ссылку (путь) на данные.
3. Используйте механизмы, такие как URI или ContentProvider, для безопасного доступа к большим данным. Это предотвратит ошибки превышения размера данных в Intent.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥2
Sealed классы являются мощным инструментом для создания ограниченных иерархий классов, что обеспечивает безопасное и предсказуемое использование классов.
Все классы, которые наследуются от sealed класса, должны быть определены в одном файле с самим sealed классом. Это ограничение введено для обеспечения полной контрольной иерархии и предотвращения добавления новых подтипов в другом месте.
sealed class Result {
class Success(val data: String) : Result()
class Error(val exception: Exception) : Result()
} Sealed класс не может быть интерфейсом. Если вам нужно определить ограниченную иерархию интерфейсов, вы должны использовать обычные интерфейсы и sealed классы вместе.
Хотя sealed классы и являются абстрактными по своей природе (их нельзя напрямую инстанцировать), они не могут быть явно помечены как
abstract. Sealed классы и их подтипы не могут быть
private. Они должны быть либо public, либо internal, чтобы их можно было использовать в рамках всего файла иерархии.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, если все подтипы покрыты.Это делает код более предсказуемым и безопасным.
Это делает код более читаемым и менее подверженным ошибкам.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥2
1. Это нужно, чтобы избегать рефлексии и писать более читаемый код.
2. Пример: фильтрация элементов коллекции по типу list.filterIsInstance<T>().
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍2
При создании классов по сравнению с 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
}
}
}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
2. Nothing: указывает, что функция никогда не завершится успешно (например, выбрасывает исключение).
3. Any: корневой тип для всех объектов в Kotlin.
4. Nullable типы: добавляют ?, чтобы разрешить null в значении.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥3
При наследовании
data class от какого-либо суперкласса в Kotlin, важно понимать, как работают свойства (поля) суперкласса и как они влияют на функциональность и структуру data class. Поля (свойства), объявленные в суперклассе, автоматически становятся доступными в классе-наследнике. Вы можете использовать их в наследуемом классе как обычно. Однако свойства суперкласса не участвуют в автоматически сгенерированных функциях
equals(), hashCode(), и toString() для data class.У
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
1. Они взаимодействуют через Intent, который передаёт команды и данные.
2. Каждый компонент регистрируется в AndroidManifest.xml.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍7
Различия между Android 7 (Nougat) и Android 8 (Oreo) заключаются в добавленных функциях, изменениях в производительности, безопасности, работе приложений и пользовательском интерфейсе.
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