
Android Q — це 10-й основний реліз та 17-та версія мобільної операційної системи Android. Перша бета-версія Android Q була випущена 13 березня 2019 року, сьогодні ми вже маємо 4-ту версію для тестування. Проте все ще трапляються неприємні моменти, такі як збої лаунчера, проблеми з камерою або збій процесу System UI у разі розблокування телефону за допомогою датчика відбитків пальців.
У будь-якому випадку, релізи бета-версій Google Android Q 5 та 6 заплановані на липень, а приблизно до кінця кварталу очікується стабільний реліз. Давайте подивимося, які значні та цікаві зміни відбудуться і яких нововведень слід очікувати користувачам та розробникам у новій версії Android. Думаю, буде доцільно розділити зміни, які стосуються UI, та ті, що стосуються підходу до програмування.
Що змінилося в дисплеї?
1) У останній версії Android розробники отримали можливість відображати налаштування інтерфейсу зв'язку безпосередньо в додатку, не виходячи з нього. Більше не буде необхідності відкривати системні налаштування як окрему активність. До речі, тепер це ще більше нагадує BottomSheet, що дозволяє перемикати мобільний інтернет або Bluetooth або підключатися до WiFi.
Розробник також отримує доступ до налаштувань NFC, гучності та окремого підключення WiFi. Щоб викликати налаштування, користувач повинен створити намір і визначити, що саме потрібно налаштувати.
Можливі параметри: ACTION_INTERNET_CONNECTIVITY / ACTION_WIFI / ACTION_NFC
val panelIntent = Intent(Settings.Panel.ACTION_INTERNET_CONNECTIVITY) startActivityForResult(panelIntent, CONNECTIVITY_REQUEST_CODE)
2) Функції обміну контентом також були розширені. Тепер DirectShare API дозволяє не тільки додавати контент до попереднього перегляду, але й вказувати певну категорію додатків або користувачів, з якими потрібно поділитися цим контентом.
Нижче ви можете побачити приклад простого використання.
privatefun shareContent(imageUrl: Uri?=null){if(imageUrl ==null){ imagePicker?.choosePicture(false)}else{val sharingIntent = Intent(Intent.ACTION_SEND) sharingIntent.type="text/plain" sharingIntent.putExtra(Intent.EXTRA_TITLE, "Надіслати повідомлення") sharingIntent.putExtra(Intent.EXTRA_TEXT, "Привіт!") // (Необов'язково) якщо ви хочете попередній перегляд, створіть URI контенту та додайте його// Система підтримує лише URI контентуval thumbnail = getClipDataThumbnail(imageUrl)if(thumbnail !=null){ sharingIntent.clipData= thumbnail sharingIntent.flags= Intent.FLAG_GRANT_READ_URI_PERMISSION} startActivity(Intent.createChooser(sharingIntent, null))}} privatefun getClipDataThumbnail(imageUri: Uri): ClipData?{returntry{ ClipData.newUri( contentResolver, null, imageUri )}catch(e:FileNotFoundException){ e.printStackTrace()null}catch(e:IOException){ e.printStackTrace()null}}
Унікальний ідентифікатор медіафайлу передається як параметр функції shareContent. Ви можете вибрати будь-який вибірник файлів, але важливо, щоб один з параметрів, які він повертає, був Uri.
4) Додано функцію плаваючих вікон у вигляді бульбашки. Це точно так само, як у Facebook Messenger. Тепер вам не потрібно створювати щось з нуля або ламати голову, наразі це готове рішення. Більше того, існує кілька видів бульбашок: прості, які з'являються на екрані, та ті, що відкриваються автоматично.
Щоб отримати такий результат, ми повинні додати параметри в манифест для оголошення активності, яка відкриється при натисканні на бульбашку
<activity android:name=".bubbles.BubbleActivity" android:allowembedded="true" android:documentlaunchmode="always" android:resizeableactivity="true"></activity>
та передати PendingIntent до метаданих сповіщення.
privatefun createNotificationChannel(){// Створіть NotificationChannel, але тільки на API 26+, оскільки// клас NotificationChannel новий і не входить до бібліотеки підтримкиif(Build.VERSION.SDK_INT>= Build.VERSION_CODES.O){val name ="BubbleBot"val importance = NotificationManager.IMPORTANCE_HIGHval channel = NotificationChannel(NOTIFICATION_CHANNEL_ID, name, importance)// Зареєструйте канал у системі; ви не можете змінити важливість// або інші поведінки сповіщень після цьогоval notificationManager = getSystemService(NotificationManager::class.java) notificationManager?.createNotificationChannel(channel)}} @TargetApi(Build.VERSION_CODES.Q)privatefun showBubble(){val target = Intent(this, BubbleActivity::class.java)val bubbleIntent = PendingIntent.getActivity(this, 0, target, 0) // Створіть метадані бульбашкиval bubbleData = Notification.BubbleMetadata.Builder() .setDesiredHeight(600) .setIcon(Icon.createWithResource(this, R.drawable.ic_launcher_foreground)) .setIntent(bubbleIntent) .build() val chatBot = Person.Builder() .setBot(true) .setName("BubbleBot") .setImportant(true) .build() val notification = Notification.Builder(this, NOTIFICATION_CHANNEL_ID) .setContentIntent(bubbleIntent) .setSmallIcon(R.drawable.ic_launcher_foreground) .setBubbleMetadata(bubbleData) .addPerson(chatBot) .build() val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE)as NotificationManager notificationManager.notify(1, notification)}
За допомогою метаданих можна також налаштувати відображення бульбашки та вікна, яке відкриється. Наприклад, ми передаємо висоту вікна та іконку бульбашки. Окрім метаданих, у нас є можливість передати корисну інформацію, наприклад, повідомлення, отримані через сповіщення.
5) Запит на доступ до геолокації також зазнав деяких змін. Тепер користувач може визначити режим її використання: застосунок може використовувати геолокацію лише під час запуску або постійно. Іншими словами, тепер користувач може визначити, чи повинен застосунок використовувати координати пристрою, коли він неактивний.
Що змінилося під капотом?
1) По-перше, більшість змін стосуються підтримки додаткових та складних екранів. Тепер Android буде підтримувати розгортання екранів з коробки. Як уже згадувалося вище, маніфест отримав нову директиву android:resizeableActivity="true".
У такому випадку, коли екран смартфона розгортається, буде викликано зворотний виклик onConfigurationChanged з новими параметрами, і активність автоматично розшириться на весь екран.
До речі, офіційні документи вказують, що якщо ви не вкажете в маніфесті, що активність може змінювати свій обсяг, нова частина екрану буде розглядатися як додатковий дисплей. Тоді користувач зможе запустити ще один додаток на ньому.
Життєвий цикл активностей також зазнав змін. Було додано новий зворотний виклик onTopResumedActivityChanged. Це зумовлено необхідністю запускати 2 додатки на окремих екранах іноді. Однак лише один додаток має фокус; при отриманні фокусу іншим додатком буде викликано цей зворотний виклик.
2) Важливо згадати про велику кількість змін у пакетах, внутрішніх бібліотеках та принципі роботи APT. Формат dex2oat, наприклад, більше не буде підтримуватися.
Для більш детальної інформації про оновлення android q та нові функції ви можете переглянути сторінку попереднього перегляду.