Содержание статьи
Почитать
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.
). PendingIntent используется в Android, чтобы позволить системе или сторонним приложениям передать интент от имени другого приложения.FLAG_IMMUTABLE - Борьба с оверлеями. 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 nullreturn 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()}}
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»