574 Stimmen

So starten Sie eine Aktivität aus einer anderen Anwendung in Android

Ich möchte ein installiertes Paket aus meiner Android-Anwendung heraus starten. Ich gehe davon aus, dass dies mit Intents möglich ist, aber ich habe keine Möglichkeit gefunden, dies zu tun. Gibt es einen Link, wo man die Informationen finden kann?

2 Stimmen

Was passiert, wenn ich die zweite App von der ersten aus öffne und dann direkt auf das Symbol der zweiten App klicke, erhalte ich zwei Instanzen der App, was nicht erwünscht ist. Wie kann ich damit umgehen?

0 Stimmen

791voto

andep Punkte 7823

Wenn Sie die Hauptaktivität nicht kennen, kann der Paketname verwendet werden, um die Anwendung zu starten.

Intent launchIntent = getPackageManager().getLaunchIntentForPackage("com.package.address");
if (launchIntent != null) { 
    startActivity(launchIntent);//null pointer check in case package name was not found
}

6 Stimmen

Gibt es einen Grund, warum dies nicht funktionieren sollte? Bei mir hat es zumindest nicht geklappt.

34 Stimmen

Es wird ein neuer Intent gestartet, wie wäre es, die Anwendung, die im Hintergrund läuft, wieder aufzunehmen?

3 Stimmen

@andep: Das hat bei mir gut funktioniert, als ich zwischen zwei selbst erstellten Anwendungen getestet habe. Sobald ich den Paketnamen kenne, wird dies immer funktionieren, oder gibt es eine Möglichkeit, jemanden daran zu hindern, Ihre App zu starten (im Maniefest oder irgendwo)?

273voto

Jared Burrows Punkte 52572

Ich weiß, dass diese Frage bereits beantwortet wurde, aber ich habe etwas Ähnliches umgesetzt:

Intent intent = getPackageManager().getLaunchIntentForPackage("com.package.name");
if (intent != null) {
    // We found the activity now start the activity
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
} else {
    // Bring user to the market or let them choose an app?
    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);
}

Noch besser: Hier ist die Methode:

public void startNewActivity(Context context, String packageName) {
    Intent intent = context.getPackageManager().getLaunchIntentForPackage(packageName);
    if (intent != null) {
        // We found the activity now start the activity
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    } else {
        // Bring user to the market or let them choose an app?
        intent = new Intent(Intent.ACTION_VIEW);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setData(Uri.parse("market://details?id=" + packageName));
        context.startActivity(intent);
    }
}

Duplizierter Code wurde entfernt:

public void startNewActivity(Context context, String packageName) {
    Intent intent = context.getPackageManager().getLaunchIntentForPackage(packageName);
    if (intent == null) {
        // Bring user to the market or let them choose an app?
        intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse("market://details?id=" + packageName));
    }
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(intent);
}

12 Stimmen

Ich hatte ein Problem, wenn ich einen Intent für ein Facebook- oder Twitter-Profil startete. Sie wurden innerhalb meiner App geöffnet, anstatt als neue Aktivität. Das Hinzufügen des FLAG_ACTIVITY_NEW_TASK hat das Problem gelöst. Vielen Dank!

4 Stimmen

Kein Problem! Ich hatte Probleme mit etwas sehr ähnlichem

1 Stimmen

Die Methode funktioniert bei mir, aber manchmal ist die neue Anwendung geöffnet und die aufrufende Aktivität ist immer noch im Vordergrund. Irgendwelche Ideen, wie man das beheben kann?

175voto

Bastian Punkte 9075

Ich habe die Lösung gefunden. In der Manifestdatei der Anwendung fand ich den Paketnamen: com.package.address und den Namen der Hauptaktivität, die ich starten möchte: MainActivity Der folgende Code startet diese Anwendung:

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

11 Stimmen

Ich habe die Ausnahme ' Dosis Sie deklarieren Aktivität in Ihrem Manifest.xml'

1 Stimmen

Dieser Weg gibt eine Ausnahme zurück, die sagt, dass ich die Aktivität in meinem Manifest deklarieren muss aber es ist eine externe App!

1 Stimmen

Wie kann man es im Hintergrund laufen lassen? Das bedeutet, dass die zweite aufgerufene Anwendung nicht auf dem Bildschirm angezeigt wird, sondern ihre onCreated()-Methode ausführt.

22voto

Ahamadullah Saikat Punkte 3960
// in onCreate method
String appName = "Gmail";
String packageName = "com.google.android.gm";
openApp(context, appName, packageName);

public static void openApp(Context context, String appName, String packageName) {
    if (isAppInstalled(context, packageName))
        if (isAppEnabled(context, packageName))
            context.startActivity(context.getPackageManager().getLaunchIntentForPackage(packageName));
        else Toast.makeText(context, appName + " app is not enabled.", Toast.LENGTH_SHORT).show();
    else Toast.makeText(context, appName + " app is not installed.", Toast.LENGTH_SHORT).show();
}

private static boolean isAppInstalled(Context context, String packageName) {
    PackageManager pm = context.getPackageManager();
    try {
        pm.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES);
        return true;
    } catch (PackageManager.NameNotFoundException ignored) {
    }
    return false;
}

private static boolean isAppEnabled(Context context, String packageName) {
    boolean appStatus = false;
    try {
        ApplicationInfo ai = context.getPackageManager().getApplicationInfo(packageName, 0);
        if (ai != null) {
            appStatus = ai.enabled;
        }
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    return appStatus;
}

20voto

mayank1513 Punkte 8347

Bearbeiten je nach Kommentar

In einigen Versionen - wie in Kommentaren vorgeschlagen - kann die ausgelöste Ausnahme anders sein.

Daher wird die folgende Lösung leicht abgewandelt

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

Original-Antwort

Obwohl die Frage gut beantwortet wurde, gibt es eine ziemlich einfache Implementierung, die behandelt, wenn die App nicht installiert ist. Ich mache es wie folgt

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

Ersetzen Sie "applicationId" durch das Paket, das Sie öffnen möchten, z. B. com.google.maps usw.

1 Stimmen

Le site PackageManager.getLaunchIntentForPackage(...) Methode gibt null zurück, wenn der Paketname nicht erkannt wird. Sie wirft nicht PackageManager.NameNotFoundException . Siehe aquí .

0 Stimmen

Ich habe gerade versucht startActivity(null) auf einem Android 10-Emulator und es wird ein NullPointerException und nicht ein PackageManager.NameNotFoundException .

0 Stimmen

Auf meinem Note 7 funktioniert es genau so, wie es vorgesehen ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X