Wie starte ich eine Aktivität in einer anderen Anwendung?

77

Ich habe Anwendung A wie folgt definiert:

<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name="com.example.MyExampleActivity"
              android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

Wie kann ich nun in Anwendung B den Code schreiben, um die Aktivität in Anwendung A zu starten? Vielen Dank!

user256239
quelle

Antworten:

151

Wenn bei Ihnen der Fehler "Berechtigungsverweigerung: Absicht starten ..." auftritt oder wenn die App beim Starten der App ohne Grund abstürzt, verwenden Sie diesen einzeiligen Code in Manifest

android:exported="true"

Bitte seien Sie vorsichtig mit finish (); Wenn Sie es verpasst haben, wird die App eingefroren. Wenn es erwähnt wird, wäre die App ein reibungsloser Launcher.

finish();

Die andere Lösung funktioniert nur für zwei Aktivitäten, die sich in derselben Anwendung befinden. In meinem Fall kennt Anwendung B die Klasse com.example.MyExampleActivity.classim Code nicht, sodass die Kompilierung fehlschlägt.

Ich habe im Internet gesucht und unten so etwas gefunden, und es funktioniert gut.

Intent intent = new Intent();
intent.setComponent(new ComponentName("com.example", "com.example.MyExampleActivity"));
startActivity(intent);

Sie können auch die setClassName-Methode verwenden:

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setClassName("com.hotfoot.rapid.adani.wheeler.android", "com.hotfoot.rapid.adani.wheeler.android.view.activities.MainActivity");
startActivity(intent);
finish();

Sie können die Werte auch von einer App an eine andere App übergeben:

Intent launchIntent = getApplicationContext().getPackageManager().getLaunchIntentForPackage("com.hotfoot.rapid.adani.wheeler.android.LoginActivity");
if (launchIntent != null) {
    launchIntent.putExtra("AppID", "MY-CHILD-APP1");
    launchIntent.putExtra("UserID", "MY-APP");
    launchIntent.putExtra("Password", "MY-PASSWORD");
    startActivity(launchIntent);
    finish();
} else {
    Toast.makeText(getApplicationContext(), " launch Intent not available", Toast.LENGTH_SHORT).show();
}
user256239
quelle
1
Freut mich, diese Antwort zu sehen! In meinem Fall (Android 4.2) wurde jedoch der Fehler "Berechtigungsverweigerung: Absicht starten ..." angezeigt. Irgendeine Ahnung?
JackWM
11
@ JackWM Android hinzufügen: exportiert = "true" zu Ihrer Aktivitätseigenschaft
Evan_HZY
3
@ JackWM funktioniert auch, wenn die Aktivität, die Sie starten möchten, einen Absichtsfilter hat. Dies liegt daran, dass der Standardwert für das android:exportedXML-Attribut ist, truewenn ein Absichtsfilter vorhanden ist.
Trebor Rude
Nun, da Sie die Aktivität der 2. Anwendung von der 1. Anwendung aus gestartet haben, gibt es einen Hinweis darauf, wie Sie programmgesteuert in der 2. Anwendung feststellen können, welche Aktivität (oder Anwendung) diese Aktivität gestartet hat? Die Antwort ist natürlich die 1. Anwendung, aber wie Sie sie erhalten in Ihrer 2. Anwendung programmgesteuert?
Sash_KP
3
Hmm, ich arbeite nicht für mich. Ich habe zwei Apps mit jeweils einer Aktivität: com.examplea.MainActivityAund com.exampleb.MainActivityB. Von MainActivityA aus führe ich Ihr Code-Snippet mit den Zeichenfolgen "com.exampleb" und "com.exampleb.MainActivityB" aus. Allerdings bekomme ich geradeandroid.content.ActivityNotFoundException: Unable to find explicit activity class {com.exampleb/com.exampleb.MainActivityB}; have you declared this activity in your AndroidManifest.xml?
Erhannis
15

Wenn beide Anwendungen dieselbe Signatur haben (dh beide APPS gehören Ihnen und mit demselben Schlüssel signiert sind), können Sie Ihre andere App-Aktivität wie folgt aufrufen:

Intent LaunchIntent = getActivity().getPackageManager().getLaunchIntentForPackage(CALC_PACKAGE_NAME);
startActivity(LaunchIntent);

Ich hoffe es hilft.

Azelez
quelle
7
Sie benötigen nicht beide Apps, um dieselbe Signatur zu haben. Sie können Google Maps beispielsweise folgendermaßen starten: Intent i = getPackageManager (). GetLaunchIntentForPackage ("com.google.android.apps.maps");
Tim Autin
1
@ TimAutin Was ist, wenn ich eine bestimmte Aktivität starten muss, die zu einer App gehört, über die ich keine Kontrolle habe?
Epicality
1
Ich musste das nie tun, also weiß ich es nicht. Haben Sie diese Antwort versucht stackoverflow.com/a/2210073/1356106 ?
Tim Autin