2012-06-09 15 views
10

Ich habe zwei Android-Anwendungen, angenommen, sie sind "A" und "B", "A" hat fünf Aktivitäten, und ich möchte seine spezifische Aktivität von Schaltfläche klicken Ereignis von "B". testete ich auf diese Weise eine Anwendung von einem anderen Aufruf:Android: Anruf Aktivität einer anderen Anwendung

Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage("com.testapp.ws"); 
startActivity(LaunchIntent); 

„com.testapp.ws“ ist der Paketname von „A“.

Dies führt "A" von seiner ersten Aktivität wieder nicht von der spezifischen Aktivität. Wie kann ich die angegebene Aktivität von A aufrufen?

Antwort

30

Grant,

Das Problem hier ist eindeutig ein Missverständnis des Android Application Model. Commonsware ist absolut korrekt darüber, wie man dieses Problem lösen kann. Ohne die Grundlagen von Android zu verstehen, kann ich jedoch erkennen, warum Sie Schwierigkeiten bei der Anwendung haben. Also, eine kurze Erklärung:

Jede Aktion in Android beginnt mit einer Absicht. Dies gilt insbesondere für Aktivitäten. Jede Aktivität hat eine Absicht. Um den Entwicklern die Oberfläche zu erleichtern, können Sie auf eine Absicht des Betriebssystems reagieren ODER Sie können eine Absicht aus der zu verwendenden Klasse "Aktivitäten" erstellen. Im Allgemeinen ist es die beste Vorgehensweise, die erste Option zu wählen.

Als Reaktion auf eine Intent

Wenn eine Intent Kommissionierung zu reagieren, können Sie buchstäblich auf jede Absicht antworten. Dies wird als Aktion bezeichnet. Wenn ich einen Intent mit der Bezeichnung "FOO" erstellt habe, könnte die Aktivität in der Leiste diesen aufgreifen und darauf reagieren. Wir haben jedoch Konventionen, und die wichtigste davon ist, dass Sie Ihren Paketnamen einer beliebigen Absicht voranstellen. Zum Beispiel "com.company.package.FOO". Einfach gesagt, das ist so, dass wir Kollisionen mit anderen Apps vermeiden.

Jede Aktivität kann auf verschiedene Ereignisse reagieren. Dies ist in der AndroidManifest.xml definiert.

<activity android:name="Activity3" ... > 
    <intent-filter> 
     <action android:name="com.company.package.FOO"/> 
     <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> 
</activity> 

Oben, wir setzen auch die Kategorie DEFAULT, so dass es sei denn, der Benutzer ändert, werden wir die einzige Anwendung, die auf unsere eigene Absicht reagiert. Die Art und Weise, dass wir dann die Absicht nennen, ist mit dem gleichen Namen, die wir geschaffen (das heißt „com.company.package.FOO“)

startActivity(new Intent("com.company.package.FOO")); 

Das ist, wie es funktioniert! Sie würden einfach das obige "com.company.package.FOO" in Ihren Paketnamen (definiert durch Ihre Anwendung) und etwas Sinnvolles ändern. Ein Beispiel ist "com.testapp.ws.SWAT_FLIES".

Warum Ihr Code nicht

Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage("com.testapp.ws"); 

Der obige Code sieht für eine bestimmte Art von Intent Aktion arbeiten.Denken Sie daran, wenn Sie die AndroidManifest und die erste Aktivität hat Sie setzen:

<action android:name="android.intent.action.MAIN"> 
<category android:name="android.intent.category.LAUNCHER"> 

Well ... getLaunchIntentForPackage() nur die Absicht für die erste Aktivität erhält. Das ist der Grund, warum wir eine benutzerdefinierte Absicht machen ... Erstens, weil wir nicht wirklich wollen, dass es unsere dritte Aktivität ist, um unser Startup zu sein ... Und zweitens, weil das Betriebssystem uns nur die Startaktivität mitteilen wird. Wir haben es zu sagen, mit unseren eigenen Aktion (zB „com.testapp.ws.SWAT_FLIES“)

hoffe, das hilft,

FuzzicalLogic

+0

Danke Mr.Fuzzical Logic für die detaillierte Beschreibung. Nach dem Verweisen auf Ihre Erklärung habe ich die App erfolgreich implementiert. Ich danke dir sehr! – Grant

+0

Wie kann dies erreicht werden, wenn ich die Daten von einer Aktivität in einer App an einen Dienst in einer anderen Anwendung senden möchte. – Aada

+0

Eigentlich brauchen Sie nur die Absicht ACTION und senden Sie die Daten über setExtra, bevor Sie den startService() auslösen. Möglicherweise müssen Sie zuerst den Intent konstruieren (zB Intent myIntent = new Intent ("com.company.app.ACTION") –

20

Schritt # 1: ein <intent-filter> auf die dritte Aktivität mit einer benutzerdefinierten Aktion hinzufügen:

<intent-filter> 
    <action android:name="com.testapp.ws.SOMETHING_USEFUL"/> 
    <category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 

Schritt # 2: diese Aktivität startet einen entsprechenden Intent mit:

startActivity(new Intent("com.testapp.ws.SOMETHING_USEFUL")); 
+0

Was ich hinzufügen sollte Hier ?? "SOMETHING_USEFUL" in der XML- und Aktivitätsklasse? Kannst du bitte mehr erklären? Vielen Dank! – Grant

+1

Was ist mit der 'Kategorie', ist es hier notwendig? –

+1

@ Eng.Fouad: Ah, ja, Sie brauchen ein '' Element für die 'DEFAULT' Kategorie in diesem' '- meine Entschuldigung. – CommonsWare

0

Es gibt Fälle, in denen Sie nicht zwei Anwendungen, die Sie möglicherweise verwenden insbesondere haben Bearbeitungsfunktionen für oder Sie können nicht benutzerdefinierte Absichten machen wollen, so dass in diesem Fall eine Alternative (für die Verfügbarkeit mit besserer Fehlerprüfung) ist:

Intent intent = new Intent(); 
intent.setClassName("PACKAGE_NAME", "PACKAGE_NAME.TARGET_ACTIVITY"); 
if (isCallable(context, intent)) { 
    // Attach any extras, start or start with callback 
} else { 
    // Respond to the application or activity not being available 
} 

Irgendwo in der Hauptklasse oder in einer Unterklasse, der Griffe allgemeine Methoden:

public static boolean isCallable(Activity activity, Intent intent) { 
    List<ResolveInfo> list = activity.getPackageManager().queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY); 
    return list.size() > 0; 
} 
1

hier ist der Code eine App (ex whatsapp) von einem anderen

App zu öffnen

public class MainActivity Aktivität erstreckt {

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Button bClock = (Button) findViewById(R.id.button1); 
    bClock.setOnClickListener(new OnClickListener() { 
    public void onClick(View v) { 
    Intent i = new Intent(Intent.ACTION_MAIN); 
    PackageManager managerclock = getPackageManager(); 
    i = managerclock.getLaunchIntentForPackage("com.whatsapp"); 
    i.addCategory(Intent.CATEGORY_LAUNCHER); 
    startActivity(i); 
    } 
    }); 

} }

Verwandte Themen