Можно ли открыть компонент другого приложения явным интентом в Android
Что проверяют
Понимаете ли вы разницу между «знать имя класса» и «иметь право запустить компонент». Следом спрашивают, что изменилось в Android 11 и 12 и почему resolveActivity() вдруг начал возвращать null.
Как отвечать
Да, если целевой компонент это разрешает. Конструктор Intent(context, TargetActivity::class.java) здесь не подходит: он работает только для классов своего приложения. Для чужого указывают пакет и полное имя класса:
val intent = Intent().setComponent(
ComponentName("com.other.app", "com.other.app.ui.TargetActivity")
)
try { startActivity(intent) } catch (e: ActivityNotFoundException) { }Условия, при которых это сработает:
android:exported="true": иначе будетSecurityException. С Android 12 атрибут обязателен для компонентов сintent-filter, а без фильтра компонент по умолчанию закрыт;- права: если у компонента указан
android:permission, вызывающее приложение должно его иметь; - видимость пакетов: с Android 11
queryIntentActivities(),resolveActivity()иgetPackageInfo()не видят чужие приложения без<queries>в манифесте. СамstartActivity()при этом работает, поэтому надёжнее запускать и ловитьActivityNotFoundException; - сервисы:
bindService()требует явный интент с Android 5.0, а запуск чужого сервиса из фона ограничен с Android 8.
Хорошо добавить про архитектуру. Имя класса в чужом приложении не контракт: его переименуют в следующей версии, и интеграция молча сломается. Устойчивее неявный интент с собственным action, который второе приложение объявляет в intent-filter, плюс setPackage(), чтобы адресат был однозначен.
Где спотыкаются
Пишут Intent(context, OtherActivity::class.java) для чужого класса. Это не скомпилируется: класса нет в вашем classpath.
Проверяют установку через resolveActivity() и на Android 11+ получают null, хотя приложение стоит. Без <queries> метод просто не видит пакет.
Забывают про exported у своих компонентов и открывают внутренние активити всему устройству. Это классическая уязвимость: чужое приложение запускает экран в обход авторизации.