«Давно не виделись~ За последние месяцы произошло много изменений. Будь то наша семья или социальное окружение, это также незаменимая способность делать то, что мы можем, и медленно адаптироваться к новым изменениям!
Android 14 скоро выйдет официально. На что вам как разработчику следует обратить внимание? Короче говоря, давайте посмотрим~
В основном разделен на две части: Во-первых, это касается всех Android приложения, эти изменения затронут все Приложение, пока вы App установлен в Android14 Эти эффекты затронут все устройства; Второе, когда targetSdkVersion обновить до 34 После этого наш App полученныйиз Влияние。Давайте сначала поговорим о первой части этой статьи.изсодержание,Прямо сейчассуществующий App установить в Android14 Какое влияние это окажет на мобильные телефоны?。
Полное название этого разрешения: android.permission.SCHEDULE_EXACT_ALARM
,Используется для включения настройки точного разрешения будильника. Точный из будильника подходит для указанного пользователем времени уведомлений.,илидасуществовать Точное время, необходимое для выполнения операции.
Если для targetSdkVersion приложения установлено значение 33 (Android13) или выше, это разрешение отключено по умолчанию при запуске на устройстве Android14. Поэтому, когда в приложении используется точный будильник и операции необходимо выполнять в точное время, вам необходимо явно подать заявку на это разрешение в файле манифеста и динамически получать это разрешение от пользователя при его использовании.
В частности, при использовании AlarmManager
в
setExact(int type, long triggerAtMillis, PendingIntent operation)
、
setExactAndAllowWhileIdle(int type, long triggerAtMillis, PendingIntent operation)
、
setAlarmClock(AlarmManager.AlarmClockInfo info, PendingIntent operation)
При использовании этих трех функций, если targetSdkVersion >= 33 и в Android14 Если разрешение явно не запрошено на устройстве, SecurityException
аномальный.
Особые обстоятельства:
1) Если пользователь использует функцию «Резервное копирование и восстановление» для App перевод в Android14 на устройстве, то это App Это разрешение по-прежнему отключено по умолчанию;
2) Если App Уже включил Должен Разрешения, когда устройство обновится до Android14 Позже это App Разрешение включено;
3) Когда прозвучит точный будильник OnAlarmListener
настраиватьиз,Нет необходимости подавать заявку Долженразрешения.Например:setExact(int type, long triggerAtMillis, String tag, AlarmManager.OnAlarmListener listener, Handler targetHandler)
Этот метод не требует применения.
Используется чаще API:
1)boolean canScheduleExactAlarms()
Определите, можно ли установить точный сигнал тревоги (API >= 31 Этот метод суждения существует только);
2)AlarmManager.ACTION_SCHEDULE_EXACT_ALARM_PERMISSION_STATE_CHANGED
Широковещательные сообщения часто используются для прослушивания обратных вызовов, когда пользователи включают или отключают это разрешение (API >= 31 Существует только этот тип широковещательного сообщения).
Нерекомендуемые сценарии использования:
1) если App Чтобы запланировать повторяющиеся операции в течение жизненного цикла, вы можете использовать Handler
в postAtTime
Вместо этого подождите. Напротив, если вы хотите установить 30min позже или завтра днем 2 Рекомендуется использовать точечную операцию;
2) Организуйте некоторые операции в фоновом режиме, например загрузку и обновление приложений, загрузку журналов и т. д. Рекомендуется использовать WorkManager
Вместо точного будильника;
3) Когда система простаивает и обрабатывает транзакции в приблизительный момент времени, могут вызываться некоторые неточные функции будильника. API обработка, например, с использованием setAndAllowWhileIdle()
вместо setExactAndAllowWhileIdle()
метод;
4) Транзакции, которые происходят примерно в определенный момент времени, указанный пользователем, или в пределах временного окна;
Процесс адаптации:
1) Позвонить alarmManager.canScheduleExactAlarms()
Проверьте, есть ли у вас это разрешение;
2) Если у вас нет разрешения, вам нужно пройти Intent
,настраивать Action
для ACTION_REQUEST_SCHEDULE_EXACT_ALARM
И добавьте имя пакета приложения, чтобы вызвать страницу настроек, позволить пользователю предоставить разрешения и вернуться к onResume
В обратном вызове оценивается, было ли запрошено разрешение.
Вот пример:
// code 1
// MyFragment.kt в коде
private val ALARM_REQUEST_CODE = 123
private var getExactSchedulePermission = false
@RequiresApi(Build.VERSION_CODES.S)
private fun scheduleAlarm() {
// Создайте Намерение используется для указания операции, которая будет выполнена при запуске запланированной задачи.
val intent = Intent(requireContext(), AlarmReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(
requireContext(),
ALARM_REQUEST_CODE,
intent,
PendingIntent.FLAG_IMMUTABLE
)
// получать AlarmManager Пример
val alarmManager = requireActivity().getSystemService(Context.ALARM_SERVICE) as AlarmManager
// Время срабатывания (здесь используется относительное время)
val triggerTime = SystemClock.elapsedRealtime() + 5000 // Срабатывает через 5 секунд
// настройка запланированных задач
if (alarmManager.canScheduleExactAlarms()) {
alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerTime, pendingIntent)
} else {
// если без Разрешения открывается страница настройки, позволяющая пользователю предоставить Должен App из Прецизионный будильник
startActivity(Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM))
getExactSchedulePermission = true
}
}
@RequiresApi(Build.VERSION_CODES.S)
override fun onResume() {
super.onResume()
if (getExactSchedulePermission) {
scheduleAlarm()
getExactSchedulePermission = false
}
}
// AlarmReceiver.kt
class AlarmReceiver: BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
Toast.makeText(context, "Alarm triggered!", Toast.LENGTH_SHORT).show()
}
}
После запуска метода ScheduleAlarm() через 5 секунд появится всплывающее сообщение~
Приложениям календаря или будильника необходимо отправлять напоминания календаря, сигналы пробуждения или напоминания, когда приложение перестает работать. Эти приложения могут запрашивать USE_EXACT_ALARM
Общие разрешения. Система предоставит USE_EXACT_ALARM
разрешение, приложения с этим разрешением смогут действовать так, как будто у них есть SCHEDULE_EXACT_ALARM
Разрешения на установку точных будильников и приложений.
Резюме: не используйте его, если можете. Если точный будильник использовался ранее, вам необходимо добавить логику получения разрешений.
существовать Android14 , мы используем Context
Регистрация контекста из приемника динамического вещания, может существовать App При входе в состояние кэша отправленные, но не полученные широковещательные сообщения помещаются в очередь на хранение. когда App Выйти из состояния кэша(Например, войдите в стойку регистрации.),Тогда система пропустит все поставленные в очередьизтранслировать。некоторыйтранслироватьизнесколько Пример Можеткслитьдляодинтранслировать。
исуществовать Manifest статические приемники вещания, зарегистрированные в файле, не могут быть поставлены в очередь, они будут существовать App Когда он выводится из состояния кэша и уничтожается, осуществляется широковещательная доставка.
«Что такое кэшированное состояние? Приложение? Простое понимание - дасуществовать За кулисамииз App,На данный момент нет обработки на стойке регистрации.,поэтому,если память необходима в другом месте системы,Система имеет право прекратить эти услуги по мере необходимости. Разумеется, приказ о прекращении действия является самым старым неиспользованным приказом и первым, который прекращается.
от Android14 начни, позвони killBackgroundProcesses()
, вы можете завершить только фоновый процесс своего приложения. Если передается имя пакета другого приложения, этот метод не влияет на фоновый процесс этого приложения и Logcat Отображается следующее сообщение:
Invalid packageName: com.example.anotherapp
Официальное объяснение следующее:
«Ваше приложение не должно использовать killBackgroundProcesses() API, а также вы не имеете права иным образом пытаться повлиять на жизненный цикл других приложений, даже в старых операционных системах. Андроид цельсуществовать Разрешить применение кешасуществовать За кулисамибегать,И существование автоматически прекращает их, когда системе требуется память. если ваше приложение без необходимости завершает работу других приложений,Так как эти приложения позже потребуется полностью перезапустить,поэтому Можетможет снизить производительность системы и увеличить энергопотребление,Это потребляет гораздо больше ресурсов, чем восстановление существующего кэша приложения.
Должен API да ActivityManager
Предоставлено полное объявление метода:
// code 2
public void killBackgroundProcesses (String packageName)
Кроме того, для его использования требуется существование Manifest Подать заявку на разрешение в файле Manifest.permission.KILL_BACKGROUND_PROCESSES
.
После тестирования я нашел это API Немного странно: убит из За Кулисамипроцесс скоро возобновится, ага. . . Что это за операция? ?
Тестовый код относительно прост: просто откройте один в дасуществовать, а другой процесс. Service
,а потом позвони killBackgroundProcesses
метод, согласно напечатанному Service
Жизненный цикл можно увидеть, Должен Service
Сначала меня убили, а потом снова ушел onCreate
、onStartCommand
Жизненный цикл, код и результаты следующие:
// code 3
// Manifest Декларация документа Service существует еще один процесс, который нужно начать в
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
<service
android:name=".MyService"
android:process="com.secondProcess" />
// запускать Service
startService(Intent(requireContext(), MyService::class.java))
// убить За кулисамипроцесс
val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
activityManager.killBackgroundProcesses(context.packageName)
результаты печати журнала:
это видно по картинке,существовать Android14 На устройстве вызовите killBackgroundProcesses
способы убить себя App из За кулисамипроцесс,Но выстоит Прямо сейчассновазапускать。существовать Следующее также можно найти в исходном кодеизкод,Хотя устарело:
// code 3
@Deprecated
public void restartPackage(String packageName) {
killBackgroundProcesses(packageName);
}
Кажется, это API Просто используйте да, чтобы перезапустить App фоновый процесс?
Попробуйтесуществовать Android14 на устройстве A App Позвони этому API убить B App из За кулисамипроцесс, это действительно не имеет никакого эффекта, но еслидасуществовать; Android14 Вызывается на следующих устройствах, действительно может убить B App фоновый процесс. Заинтересованные студенты также могут попробовать.
краткое содержание:killBackgroundProcesses
API Это бесполезно~ (советы начальства приветствуются)
существовать Android14 На системный телефон он не установится targetSdkVersion < 23 (ниже, чем Android6.0) App。
Название медиакитасуществовать Android14 может быть скрыто. В настоящее время медиатека поддерживает OWNER_PACKAGE_NAME
Столбец запрашивает все медиа-файлы под определенным именем пакета. Приложение сохраняет медиа-файлы со своей собственной информацией об имени пакета. Эта информация будет существовать Скрыто на Android 14, если не выполнено одно из следующих условий:
1) Имя пакета приложения, в котором хранятся медиафайлы, всегда видно другим приложениям (само оно открыто для всех остальных приложений). App);
2) Приложение, запрашивающее медиатеку, получило QUERY_ALL_PACKAGES
Разрешения (другие App Обратиться к пользователю и получить разрешение).
Дайте Кастан: Когда приложение сохраняет медиафайл (например, фотографию или видео),Он запишет файл Должен из информации о существовании в медиатеке.,включать Должендокументиз Имя пакета владельца。Другие приложения Можетк Запрос медиа-библиотекикполучатьэта информация,Ксуществовать самостоятельно из приложения, отображающего Должен файлы или для взаимодействия с ними.
существуют Android14 и более поздние версии,если сохраненные медиафайлы из приложения или имени пакета не всегда видны другим приложениям из,Затем существуют при запросе к медиатеке,Имя пакета владельца будет скрыто или заменено значением для анонимного. Например,Если имя пакета приложения для «com.example.app»,он хранит медиа-файл,Но оно из имени пакета скрыто,Затем, когда существуют запросы к медиатеке,Имя пакета владельца можно заменить на «com.android.providers.media».
Да,если в магазине медиафайлов из приложений есть имена пакетов, которые всегда видны другим приложениям из,или ВОЗЗапрос медиа-библиотекииз Приложение имеетQUERY_ALL_PACKAGES
Разрешения,Вы можете увидеть полное имя пакета владельца медиа-библиотеки. Например,Имя приложения для «com.example.app»,он хранит медиа-файл,И имя пакета всегда видно другим приложениям.,Затем, когда существуют запросы к медиатеке,В имени пакета владельца будет указано «com.example.app».
если твой App к Android13 или более высокая версия для целевой платформы (т. е. targetSdkVersion >= 33),исуществовать Android14 При запуске на устройстве пользователи могут предоставить доступ к своим фото и видео разделу Разрешения, т.е. индивидуально настраивать. READ_MEDIA_IMAGES
или READ_MEDIA_VIDEO
。
то есть применить READ_MEDIA_IMAGES
Если разрешение предоставлено, пользователю будут доступны только все изображения на телефоне; READ_MEDIA_VIDEO
Разрешения, будет отображаться только сотовый Все видео на телефоне доступны пользователям на выбор. Пользователи могут более подробно выбрать, на какие фотографии и видео лицензировать. App Прочитайте, используя.
Новое системное диалоговое окно выглядит следующим образом:
1) Выберите фото и видео: Android14. в Новые возможности. Пользователь выбирает конкретные фотографии и видео, которые он или она желает предоставить приложению. 2) Разрешить все: пользователь предоставляет разрешение всем. ВСЕ ФОТО и ВИДЕО устройства из разрешения ПОЛНОГО ДОСТУПА. 3) Не разрешено: пользователю запрещены все права доступа.
Уведомление:
1) Когда приложение существует в системе Photo Picker, вам не нужно ничего делать, чтобы поддержать это изменение;
2)READ_MEDIA_IMAGES
и READ_MEDIA_VIDEO
толькосуществовать Android13 Можно использовать только версию илик;
Добавлен новый READ_MEDIA_VISUAL_USER_SELECTED
разрешения, принадлежащие Dangerous уровень. Используется, когда пользователи нажимают на кнопку выбора фотографий и им необходимо подать заявку на доступ к фотографиям и видео и з Разрешения, поэтому нет необходимости подавать заявку. READ_MEDIA_IMAGES
и READ_MEDIA_VIDEO
Эти два разрешения.
Резюме: разработчикам не нужно об этом беспокоиться.,Новое из Разрешения очень безвкусно,Недоступно на данный момент,Раньше не нужно менять логику, связанную с чтением фотографий и видео.
существовать Android11(API level 30) Вызвать его можно нажав на Notification.Builder.setFullScreenIntent
Метод существует. Показывать некоторые полноэкранные уведомления на экране блокировки, но существуют. Manifest Применить в файле USE_FULL_SCREEN_INTENT
разрешения.
Полноэкранные уведомления предназначены для немедленного привлечения внимания пользователей к уведомлениям с высоким приоритетом.,Например, входящие вызовы или пользовательская конфигурация будильника.,существуют при показе полноэкранных уведомлений,Пользователи могут провести пальцем только вверх, чтобы выйти,Как показано на рисунке ниже, система предложит.
Рис. 3. Руководство по выходу из полноэкранного уведомления
от Android14 Начнем с того, что разрешенное использование этого приложения «Разрешенияиз» ограничено теми приложениями, которые обеспечивают только звонки и оповещения. Для других приложений Google Play Магазины отзовут свои дефолтные условия USE_FULL_SCREEN_INTENT
разрешения.
Можно использовать новый из API NotificationManager.canUseFullScreenIntent()
Проверьте, есть ли в приложении Разрешения, если нет, то можете использовать новое; ACTION_MANAGE_APP_USE_FULL_SCREEN_INTENT
Приходитьзапускатьпользователь Можетк Грант Должен Разрешенияизнастраиватьстраница。
Странно издаясуществовать Официальное уведомление Android14 не включилось успешно на виртуальной машине,Не говоря уже о Включите полноэкранные уведомления Понятно。Но это правда Можетк Открытьнастраивать Полноэкранное уведомление Разрешениявыключательизстраница,Следующее полноэкранное уведомление. Разрешение изменения изображения и основные сопутствующие коды:
Рис. 4. Открытие страницы настройки разрешения полноэкранных уведомлений.
// code 4
val notificationBuilder = NotificationCompat.Builder(requireContext())
.setSmallIcon(R.drawable.ic_lock_idle_alarm)
.setContentTitle("Notification Title")
.setContentText("Notification text")
// СоздайтеPendingIntent,Открыть указанную страницу при нажатии Уведомление
val намерение = намерение (контекст, NotificationFullActivity::class.java)
val fullScreenIntent =
PendingIntent.getActivity(context, 1, intent, PendingIntent.FLAG_MUTABLE)
notificationBuilder.setFullScreenIntent(fullScreenIntent, true) // Включите полноэкранные уведомления
// notificationBuilder.setContentIntent(fullScreenIntent) // Открыть обычную страницу
val notificationManager =
requireContext().getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
// Android 8.0 на Oreok требуется канал уведомлений о настройках
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channelId = "your_channel_id"
val channelName: CharSequence = "Your Channel Name"
val importance = NotificationManager.IMPORTANCE_HIGH
val channel = NotificationChannel(channelId, channelName, importance)
channel.description = "Channel description"
notificationManager.createNotificationChannel(channel)
notificationBuilder.setChannelId(channelId)
}
notificationManager.notify(5, notificationBuilder.build())
if (notificationManager.canUseFullScreenIntent()) {
notificationManager.notify(5,уведомлениеBuilder.build())
} еще {
// Настройки настройки Страница
val намерение = Намерение (Settings.ACTION_MANAGE_APP_USE_FULL_SCREEN_INTENT)
Intent.data = Uri.fromParts("пакет", requireActivity().packageName, null)
startActivity(intent)
}
если Какой босссуществовать Android14 Полноэкранные уведомления были успешно включены на устройстве, поделитесь со мной, спасибо.
Резюме: Большинство приложений не использует эту функцию полноэкранных уведомлений, и лично я считаю, что это не очень важно. . .
если приложение отображает пользователю внешнее уведомление, которое невозможно закрыть и требует Уведомление: Android14 Разрешить пользователям отключать такие уведомления. то есть прошло раньше Notification.Builder#setOngoing(true)
или NotificationCompat.Builder#setOngoing(true)
настраивать Notification.FLAG_ONGOING_EVENT
Приходить阻止пользовательзакрытие前台通知из Будьте осторожны при подаче заявления Понятно。FLAG_ONGOING_EVENT
из ХОРОШОдля изменился пользователем Android14 Вы можете отключить такие уведомления на к.
кпри обстоятельствах,Таких уведомлений до сих пор нет Можетзакрытие: 1) Когда телефон заблокирован; 2) Если пользователь решает отменить все действия с уведомлениями (помогает предотвратить случайное закрытие);
Кроме того, не изменились следующие условия: 1) Используйте CallStyle Созданное уведомление соответствует стилю уведомления о входящем вызове; 2)Контроллер политики устройств(DPC)и Для предприятийиз Пакет поддержки;
Резюме: Android Управление уведомлениями будет становиться все более строгим, и об этом давно следовало позаботиться. В действительности, даже если Android14 сотовый На телефоне такой функции нет, и большинство из них на данный момент есть. производители телефонов были запрещены App Всплывает уведомление, так что ничего. . .
Выше приведено все содержание данной статьи, в основном основанное на Официальной документация Я практиковал это некоторое время и вижу, что существующийиз App еслипрямойустановить в Android14 изсотовый На телефоне проблем не так уж и много. Многие вещи не требуют отдельного рассмотрения. Конечно, рекомендуется проверить наличие упущений и восполнить пробелы по содержанию данной статьи. если тоже хочешь знать targetSdkVersion обновить до 34 (Android14) На что еще стоит обратить внимание? Добро пожаловать, увидимся в следующей статье!
Розы, которые восхваляют людей, оставляют в их руках стойкий аромат! Добро пожаловать, ставьте лайки и делайте репосты~ При репосте указывайте источник~