it-swarm.com.de

Code, um externe App explizit zu starten

Von einer meiner Apps aus versuche ich, eine andere zu starten. Ich möchte eine explizite Absicht verwenden.

ComponentName cn = new ComponentName("com.myOtherApp", "OtherAppActivity");
Intent intent = new Intent();
intent.setComponent(cn);
context.startActivity(intent);

Beim Ausführen dieses Codes wird jedoch gefragt, ob ich diese Aktivität in meinem Manifest angegeben habe. Wenn ich jedoch Folgendes in das Manifest schreibe, erhalte ich den gleichen Fehler:

<activity Android:name="com.myOtherApp.OtherAppActivity">
</activity>

Was mache ich falsch?

Vielen Dank

22
CL22

Versuchen Sie etwas davon ...

Verwenden Sie im Manifest für 'myOtherApp' einen Intent-Filter für 'OtherAppActivity' mit einer unternehmensspezifischen Absicht. Beispiel ...

<activity
    Android:name=".OtherAppActivity"
    Android:label="@string/app_name" >
    <intent-filter>
        <action Android:name="com.mycompany.DO_SOMETHING" />
    </intent-filter>
</activity>

Dann verwenden Sie in der App "Aufruf" ...

Intent intent = new Intent();
intent.setAction("com.mycompany.DO_SOMETHING");
context.startActivity(intent);
25
Squonk

Ich hatte dieses Problem und suchte stundenlang nach einer Lösung. Schließlich fand es: http://www.krvarma.com/2010/08/launching-external-applications-in-Android . Dieser Link zeigt, wie Sie mit dem Paketmanager eine Anwendung starten, für die Sie lediglich den Paketnamen haben:

PackageManager pm = this.getPackageManager();

try
{
  Intent it = pm.getLaunchIntentForPackage(sName);

  if (null != it)
    this.startActivity(it);
}

catch (ActivityNotFoundException e)
{
}
19
Jon Vance

Sie müssen den vollständig qualifizierten Klassennamen im zweiten Parameter des neuen Komponentennamens wie folgt angeben:

ComponentName cn = new ComponentName("com.myOtherApp", "com.myOtherApp.OtherAppActivity");

Ich denke, das liegt daran, dass der Paketname im Manifest und der Aktivitätsname nicht notwendigerweise denselben Paketpfad haben müssen, sodass der neue ComponentName-Aufruf nicht den zweiten Parameter des Klassennamens auf den ersten Parameter des Paketnamens setzt.

17
Sogger

Ab API23 können Sie die Methode ComponentName.createRelative (String pkg, String cls) verwenden und Folgendes tun:

ComponentName cn = new ComponentName(ComponentName.createRelative("com.myOtherApp", ".OtherAppActivity"));
Intent intent = new Intent();
intent.setComponent(cn);
context.startActivity(intent);

Auf diese Weise können Sie ein ComponentName-Objekt mit einem relativen Klassenpfad erstellen. Beachten Sie den Punkt am Anfang des Klassenpfads. Es muss angegeben werden, dass die Methode das zweite Argument als relativen Pfad behandeln soll. Genau wie @Sogger erwähnt, beschränkt der ComponentName-Konstruktor den Klassenparameter auf einen absoluten Pfad.

Beachten Sie auch, dass Sie auf diese Weise explizite Absichten verwenden und keine zusätzlichen Absichtsfilter in die Zielaktivität einfügen müssen.

0
pgmank

Zusätzlich zur @Sogger-Antwort ist zu beachten, dass die Empfängerklasse com.myOtherApp.receiver.OtherAppActivity und das in AndroidManifest genannte Paket com.myOtherApp Ihren Code enthält

ComponentName cn = new ComponentName("com.myOtherApp", "com.myOtherApp.receiver.OtherAppActivity");
0
aarati