Содержание статьи
- Почитать
- Security-новшества Android 12
- Разработчику
- Полезные функции-расширения
- Вредные функции-расширения
- Лучший способ сбора данных из Flow
- Как работают корутины
- Библиотеки
Сегодня в выпуске: security-новшества Android 12, полезные и вредные функции‑расширения, советы по работе с Flow, лучшее объяснение принципа работы корутин. А также подборка библиотек для программистов.
Почитать
Security-новшества Android 12
First preview of Android 12 — анонс Android 12, самая интересная часть которого — новые механизмы обеспечения безопасности.
- Ужесточение правил расшаривания cookie в WebView. Вслед за Chromium WebView теперь использует более жесткие правила расшаривания куков с атрибутом SameSite. В частности, все куки с атрибутом SameSite=None обязаны иметь атрибут Secure и пересылаться по HTTPS, а ссылки между HTTP- и HTTPS-версиями сайта теперь считаются cross-site-реквестами.
- Ограничение доступа к MAC-адресу. Android 11 ограничил доступ приложений к MAC-адресу устройства, только если приложение имеет targetSdkVersion 30, в Android 12 ограничение распространяется на все приложения.
- Неэкспортируемые компоненты по умолчанию. Для приложений, собранных для Android 12 (targetSdkVersion 31), все компоненты (активности, провайдеры, сервисы) теперь автоматически помечаются как неэкспортируемые. Поведение можно изменить с помощью атрибута android:exported=true. Этот атрибут обязателен для всех интент‑фильтров приложения (иначе приложение просто не установится на Android 12).
- Безопасность PendingIntent. Приложения, собираемые с targetSdkVersion 31, теперь обязаны помечать все PendingIntent как изменяемый или неизменяемый (
PendingIntent.FLAG_MUTABLE,PendingIntent.FLAG_IMMUTABLE). PendingIntent используется в Android, чтобы позволить системе или сторонним приложениям передать интент от имени другого приложения. - Борьба с оверлеями. Android 12 запрещает нажимать элементы интерфейса сквозь непрозрачные оверлеи (окна, показываемые поверх всех приложений) за несколькими исключениями: окна ассистентов, помощников для людей с ограниченными возможностями и экранных клавиатур.
- Запрет на запуск foreground-сервисов в фоне. Приложения, собранные с targetSdkVersion 31, не смогут запускать foreground-сервисы в фоне.
- Запрет на закрытие системных диалогов. Интент
ACTION_CLOSE_SYSTEM_DIALOGSобъявлен устаревшим и больше не работает.
Разработчику
Полезные функции-расширения
5 Kotlin Extensions To Make Your Android Code More Expressive — очередная статья о том, как сделать код на Kotlin выразительнее с помощью функций‑расширений.
-
Функции для показа и скрытия элементов интерфейса:
fun View.show(){ this.visibility = View.VISIBLE}fun View.hide() { this.visibility = View.INVISIBLE}fun View.remove(){ this.visibility = View.GONE} -
Функции валидации строк:
fun String?.valid(): Boolean = this != null && !this.equals("null", true) && this.trim().isNotEmpty()fun String.isValidEmail(): Boolean = this.isNotEmpty() && Patterns.EMAIL_ADDRESS.matcher(this).matches()fun String.formatPhoneNumber(context: Context, region: String): String? { val phoneNumberKit = PhoneNumberUtil.createInstance(context) val number = phoneNumberKit.parse(this, region) if (!phoneNumberKit.isValidNumber(number)) return null return phoneNumberKit.format(number, PhoneNumberUtil.PhoneNumberFormat.INTERNATIONAL) -
Функции для работы с бандлами:
inline fun <reified T: Any> Activity.getValue(lable: String, defaultvalue: T? = null) = lazy{ val value = intent?.extras?.get(lable) if (value is T) value else defaultvalue}inline fun <reified T: Any> Activity.getValueNonNull(lable: String, defaultvalue: T? = null) = lazy{ val value = intent?.extras?.get(lable) requireNotNull((if (value is T) value else defaultvalue)){lable}}inline fun <reified T: Any> Fragment.getValue(lable: String, defaultvalue: T? = null) = lazy { val value = arguments?.get(lable) if (value is T) value else defaultvalue}inline fun <reified T: Any> Fragment.getValueNonNull(lable: String, defaultvalue: T? = null) = lazy { val value = arguments?.get(lable) requireNotNull(if (value is T) value else defaultvalue) { lable }} -
Функции для извлечения ресурсов:
fun Int.asColor() = ContextCompat.getColor(ApplicationCalss.instance, this)fun Int.asDrawable() = ContextCompat.getDrawable(MavrikApplication.instance, this) -
Показ диалогов и сообщений:
fun Context.showAlertDialog(positiveButtonLable: String = getString(R.string.okay), title: String = getString(R.string.app_name), message: String, actionOnPositveButton: () -> Unit) { val builder = AlertDialog.Builder(this) .setTitle(title) .setMessage(message) .setCancelable(false) .setPositiveButton(positiveButtonLable) { dialog, id -> dialog.cancel() actionOnPositveButton() } val alert = builder.create() alert?.show()}fun Context.showShotToast(message: String){ Toast.makeText(this, message, Toast.LENGTH_SHORT).show()}fun Context.showLongToast(message: String){ Toast.makeText(this, message, Toast.LENGTH_LONG).show()}fun View.showShotSnackbar(message: String){ Snackbar.make(this, message, Snackbar.LENGTH_SHORT).show()}fun View.showLongSnackbar(message: String){ Snackbar.make(this, message, Snackbar.LENGTH_LONG).show()}fun View.snackBarWithAction(message: String, actionlable: String, block: () -> Unit){ Snackbar.make(this, message, Snackbar.LENGTH_LONG) .setAction(actionlable) { block() }}
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
1 год9300 р. |
1 месяц870 р. |
Я уже участник «Xakep.ru»