Се­год­ня в выпус­ке: 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 вырази­тель­нее с помощью фун­кций‑рас­ширений.

  1. Фун­кции для показа и скры­тия эле­мен­тов интерфей­са:

    fun View.show(){
    this.visibility = View.VISIBLE
    }
    fun View.hide() {
    this.visibility = View.INVISIBLE
    }
    fun View.remove(){
    this.visibility = View.GONE
    }
  2. Фун­кции валида­ции строк:

    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)
  3. Фун­кции для работы с бан­дла­ми:

    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 }
    }
  4. Фун­кции для извле­чения ресур­сов:

    fun Int.asColor() = ContextCompat.getColor(ApplicationCalss.instance, this)
    fun Int.asDrawable() = ContextCompat.getDrawable(MavrikApplication.instance, this)
  5. По­каз диало­гов и сооб­щений:

    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»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


Оставить мнение