5

Как запустить Activity из другого приложения в Android

12

Я хочу запустить установленный пакет из моего Android-приложения. Я предполагаю, что это можно сделать с помощью интентов, но не смог найти способа это реализовать. Есть ли ссылка, где можно найти эту информацию?

4 ответ(ов)

7

Если вы не знаете, какая активность является главной, вы можете использовать имя пакета для запуска приложения. Вот пример кода, который демонстрирует это:

Intent launchIntent = getPackageManager().getLaunchIntentForPackage("com.package.address");
if (launchIntent != null) { 
    startActivity(launchIntent); // проверка на null, на случай если пакет не был найден
}

В этом коде мы используем метод getLaunchIntentForPackage(), чтобы получить Intent, который можно использовать для запуска приложения по его имени пакета. Если приложение с указанным именем пакета существует, launchIntent не будет равен null, и можно безопасно вызвать startActivity(). Если же пакет не найден, launchIntent будет равен null, и в этом случае код не вызовет ошибку.

2

Я знаю, что на этот вопрос уже были даны ответы, но вот как я реализовал что-то похожее:

Первоначально, код для запуска активности приложения выглядит так:

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);
}

Теперь метод стал более лаконичным и читабельным.

1

Я нашел решение. В манифесте приложения я нашел имя пакета: com.package.address и имя главной активности, которую я хочу запустить: MainActivity. Следующий код запускает это приложение:

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(new ComponentName("com.package.address", "com.package.address.MainActivity"));
startActivity(intent);
0

Редакция в зависимости от комментариев

В некоторых версиях, как упомянуто в комментариях, выбрасываемое исключение может быть другим.

Таким образом, решение ниже было немного модифицировано:

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 и т.д.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь