Как запустить Activity из другого приложения в Android
Я хочу запустить установленный пакет из моего Android-приложения. Я предполагаю, что это можно сделать с помощью интентов, но не смог найти способа это реализовать. Есть ли ссылка, где можно найти эту информацию?
4 ответ(ов)
Если вы не знаете, какая активность является главной, вы можете использовать имя пакета для запуска приложения. Вот пример кода, который демонстрирует это:
Intent launchIntent = getPackageManager().getLaunchIntentForPackage("com.package.address");
if (launchIntent != null) {
startActivity(launchIntent); // проверка на null, на случай если пакет не был найден
}
В этом коде мы используем метод getLaunchIntentForPackage()
, чтобы получить Intent
, который можно использовать для запуска приложения по его имени пакета. Если приложение с указанным именем пакета существует, launchIntent
не будет равен null
, и можно безопасно вызвать startActivity()
. Если же пакет не найден, launchIntent
будет равен null
, и в этом случае код не вызовет ошибку.
Я знаю, что на этот вопрос уже были даны ответы, но вот как я реализовал что-то похожее:
Первоначально, код для запуска активности приложения выглядит так:
Intent intent = getPackageManager().getLaunchIntentForPackage("com.package.name");
if (intent != null) {
// Мы нашли активность, теперь запускаем её
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
} else {
// Перевести пользователя в магазин или позволить ему выбрать приложение?
intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setData(Uri.parse("market://details?id=" + "com.package.name"));
startActivity(intent);
}
Я улучшил код, выделив его в метод:
public void startNewActivity(Context context, String packageName) {
Intent intent = context.getPackageManager().getLaunchIntentForPackage(packageName);
if (intent != null) {
// Мы нашли активность, теперь запускаем её
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
} else {
// Перевести пользователя в магазин или позволить ему выбрать приложение?
intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setData(Uri.parse("market://details?id=" + packageName));
context.startActivity(intent);
}
}
В результате, я убрал дублирование кода, как показано ниже:
public void startNewActivity(Context context, String packageName) {
Intent intent = context.getPackageManager().getLaunchIntentForPackage(packageName);
if (intent == null) {
// Перевести пользователя в магазин или позволить ему выбрать приложение?
intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("market://details?id=" + packageName));
}
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
Теперь метод стал более лаконичным и читабельным.
Я нашел решение. В манифесте приложения я нашел имя пакета: com.package.address
и имя главной активности, которую я хочу запустить: MainActivity
. Следующий код запускает это приложение:
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(new ComponentName("com.package.address", "com.package.address.MainActivity"));
startActivity(intent);
Редакция в зависимости от комментариев
В некоторых версиях, как упомянуто в комментариях, выбрасываемое исключение может быть другим.
Таким образом, решение ниже было немного модифицировано:
Intent launchIntent = null;
try {
launchIntent = getPackageManager().getLaunchIntentForPackage("applicationId");
} catch (Exception ignored) {}
if (launchIntent == null) {
startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse("https://play.google.com/store/apps/details?id=" + "applicationId")));
} else {
startActivity(launchIntent);
}
Оригинальный ответ
Хотя вопрос был хорошо освещен, есть довольно простая реализация, которая обрабатывает случай, когда приложение не установлено. Я делаю это так:
try {
startActivity(getPackageManager().getLaunchIntentForPackage("applicationId"));
} catch (PackageManager.NameNotFoundException e) {
startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse("https://play.google.com/store/apps/details?id=" + "applicationId")));
}
Замените "applicationId" на идентификатор пакета, который вы хотите открыть, такой как com.google.maps и т.д.
Установить курсор в конец текста в EditText
Как передать объект из одной активности в другую на Android
Отправка электронной почты в Android с использованием JavaMail API без стандартного приложения
Как заставить Android-устройство вибрировать с разной частотой?
Использование контекста в фрагменте