ent, 0)
Log.i(TAG, "Found ${activities.size}
activities")
}
}
Здесь мы создаем неявный интент с заданным действием
ACTION_MAIN
. Переменная
CATEGORY_LAUNCHER
добавлена в
категории интента.
Вызов
PackageManager.requestIntentActivities(Intent,Int)
возвращает список, содержащий
ResolveInfo
для всех
activity,
у которых есть фильтр, соответствующий данному интенту. Вы
можете указать флаги для изменения результатов. Например,
флаг
PackageManager.GET_SHARED_LIBRARY_FILES
заставляет запрос включать в
результаты дополнительные
данные (пути к библиотекам, которые связаны с каждым
приложением, удовлетворяющим требованиям). Здесь вы
передаете
0
, что указывает на то,
что вы не хотите изменять
результаты.
Запустите приложение NerdLauncher и посмотрите в выводе
LogCat
,
сколько
приложений
вернул
экземпляр
PackageManager
(у нас при первом пробном запуске их было
30).
В CriminalIntent для отправки отчетов использовался
неявный интент. Чтобы представить на экране список выбора
приложений, мы создали неявный интент, упаковали его в
интент
выбора
и
отправили
ОС
вызовом
startActivity(Intent)
:
val intent = Intent(Intent.ACTION_SEND)
... // Создание и
размещение дополнений
интентов
chooserIntent = Intent.createChooser(intent,
getString(R.string.send_report)
startActivity(chooserIntent)
Почему мы не используем этот подход здесь? Вкратце: дело
в том, что фильтр интентов
MAIN
/
LAUNCHER
может
соответствовать или не соответствовать неявному интенту
MAIN
/
LAUNCHER
,
отправленному
через
startActivity(Intent)
.
Оказывается, вызов
startActivity(Intent)
не означает
«Запустить activity, соответствующую этому неявному
интенту». Он означает «Запустить activity
поумолчанию,
соответствующую этому неявному интенту». Когда вы
отправляете
неявный
интент
с
использованием
startActivityForResult(Intent)
(или
startActivity(...)
), ОС незаметно включает в интент
категорию
Intent.CATEGORY_DEFAULT
.
Таким образом,
если вы хотите, чтобы фильтр интентов
соответствовал неявным интентам, отправленным через
startActivity(Intent)
, вы должны включить в этот фильтр
интентов категорию
DEFAULT
.
Activity с фильтром интентов
MAIN
/
LAUNCHER
является
главной точкой входа приложения, которому она принадлежит.
Для нее важно лишь то, что она является главной точкой входа
приложения, а является ли она главной точкой входа «по
умолчанию» — несущественно,
поэтому она не обязана
включать категорию
CATEGORY_DEFAULT
.
Так как фильтры интентов
MAIN
/
LAUNCHER
могут не
включать
CATEGORY_DEFAULT
, надежность их соответствия
неявным
интентам,
отправленным
вызовом
start-
Activity(Intent)
,
не
гарантирована.
Поэтому
мы
используем интент для прямого запроса у
PackageManager
информации об activity с фильтром интентов
MAIN
/
LAUNCHER
.
Следующий шаг — отображение меток этих activity в списке
RecyclerView
экземпляра
NerdLauncherFragment
.
Метка
(
label) activity представляет собой отображаемое имя — нечто,
понятное пользователю. Если учесть, что эти activity относятся
к лаунчеру,
такой меткой, скорее всего, должно быть имя
приложения.
Метки activity вместе с другими метаданными содержатся в
объектах
ResolveInfo
, возвращаемых
PackageManager
.
Сначала
отсортируйте
объекты
ResolveInfo
,
возвращаемые
PackageManager
, в алфавитном порядке меток,
получаемых
функцией
ResolveInfo.loadLabel
(PackageManager)
.
Do'stlaringiz bilan baham: