2012-08-12 18 views
5

Suchen hoch und niedrig hat kein Ergebnis für mein Problem ergeben. Daher posten wir endlich um Hilfe zu bitten.Wie bekomme ich startActivityForResult für externe Aktivitäten?

Ich habe zwei App, beide von mir geschrieben. App A startet App B und übergibt Parameter über Intent.putExtra(). Das funktioniert einwandfrei, wenn App B gestartet wird, werden die Parameter gut übergeben.

Ich kann jedoch keine Möglichkeit finden, eine Antwort an App A zurückzugeben. Das Verwenden von startActivityForResult() gab mir immer sofort onActivityResult() mit RESULT_CANCELED. Bei einer weiteren Überprüfung gab der Logcat eine Warnung aus, dass "Aktivität als neue Aufgabe gestartet wird, also das Aktivitätsergebnis abbricht".

Ich habe versucht, Aktivität von App B mit verschiedenen Startmodus, Aktion Filter (android.intent.action.PICK), aber nichts, was ich etwas geändert habe.

Mache ich das Unmögliche? Soweit ich weiß, sollte das, was ich versuche, der Verwendung von Drittanbieteraktivitäten ähneln, um Bilder aus der Fotogalerie des Geräts auszuwählen.

EDIT:

Ok, habe ich versucht, die LAUNCHER Kategorie von Aktivität B zu entfernen, aber es funktioniert immer noch nicht. Hier ist meine Aktivität:

<activity android:name=".${CLASSNAME}" android:label="@string/app_name" android:configChanges="mcc|mnc|locale|keyboardHidden|orientation" android:launchMode="standard"> 
    <intent-filter> 
     <action android:name="android.intent.action.PICK" /> 
    </intent-filter> 
</activity> 

Hat jemand tatsächlich dies zu arbeiten? Ich beginne zu vermuten, dass das Starten einer Aktivität, die von einer anderen Anwendung stammt, niemals Ergebnisse zurückliefern kann, da es scheint, dass es immer eine neue Aufgabe starten wird, egal, was du in den "Absichtsfilter" eingibst.

+0

Veröffentlichen Sie den Code, den Sie verwenden, erstellen und starten Sie die Absicht für ActivityB. Sie sollten in der Lage sein, etwas wie folgt zu setzen: 'this.setResult (Activity.RESULT_OK, data);' in der zweiten Aktivität, um zum ersten zurückzukehren. – FoamyGuy

+0

können Sie Ihre Manifest-Datei veröffentlichen? Vielleicht hat Aktivität B einige spezielle Tag – nandeesh

+0

Hmmm ... Aktivität B hatte die Ist das Problem? Ich bin gerade nicht an meiner Arbeitsmaschine. Ich werde versuchen, das zu entfernen und zu sehen, ob das funktioniert. Die Sache ist von was ich gelesen habe, beginnt eine Aktivität, die nicht Teil des gleichen Pakets ist immer in einer neuen Aufgabe zu starten? Wenn dies der Fall ist, würde startActivityForResult nicht funktionieren, um eine externe Aktivität auf einer anderen apk zu starten? –

Antwort

0

In Ihrer Tätigkeit B, sollten Sie etwas davon haben,

Intent intent = new Intent(); 
setResult(Activity.RESULT_OK, intent); 
finish(); 

oder sein kann,

setResult(Activity.RESULT_OK); 
finish(); 

, wo Sie brauchen keine

keine Daten an Aktivität A. passieren

Andernfalls wird immer mit dem Ergebniscode Activity.RESULT_CANCELED abgeschlossen;

Wenn ein Kind Aktivität aus irgendeinem Grund ausfällt (zB Absturz), die geordnete Aktivität wird ein Ergebnis mit dem RESULT_CANCELED Code.

Hoffe das hilft.

+1

Ich habe das implementiert. Das Problem ist, dass die Aktivität A onActivityResult() noch vor dem Ende von Aktivität B aufgerufen hat. Logcat gibt mir "Aktivität wird als neue Aufgabe gestartet, also Aktivitätsergebnis löschen". So schien es, dass Activity B als neue Aufgabe gestartet wird, was nicht überraschend sein sollte, da es sich um eine andere apk App handelt. Wie werden Utility-Aktivitäten wie Bildauswahl geschrieben? –

+0

@ Lf3T-Hn4D Wie Sie bereits erwähnt haben, haben Sie die Kategorie "Launcher", die die Aktivität als neue Aufgabe startet. Es wird also völlig unabhängig von der Aktivität gestartet, die es gestartet hat. Entfernen Sie diesen Kategoriestil und versuchen Sie es. http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_NEW_TASK –

+0

Ah .. ok. Ich werde es versuchen und melden, wenn ich zurück zu meiner Arbeitsmaschine komme. :-) Danke –

9

Stellen Sie sicher, dass für die Aktivität, die Sie starten, nicht android: launchMode im Manifest festgelegt ist, und überprüfen Sie, ob android: taskAffinity nicht verwendet wird. Siehe hier:

http://developer.android.com/guide/topics/manifest/activity-element.html#aff

Vergewissern Sie sich, dass die Absicht Sie die Aktivität zu starten, verwenden auf sie nicht haben FLAG_ACTIVITY_NEW_TASK gesetzt. Siehe hier:

http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_NEW_TASK

Insbesondere Hinweis: „Dieses Flag kann nicht verwendet werden, wenn der Anrufer ein Ergebnis fordert von der Aktivität gestartet wird."

Wenn die Aktivität als Teil einer neuen Aufgabe gestartet wird, ruft Android sofort die onActivityResult() mit RESULT_CANCELED auf, da eine Aktivität in einer Aufgabe keine Ergebnisse an eine andere Aufgabe zurückgeben kann, nur Aktivitäten in derselben Aufgabe so tun.

+0

große Hilfe, danke – Ninja

1

das gleiche Problem Nachdem ich einen Blick auf Quellcode nahm, und warum die NEW_TASK Flagge hinzugefügt werden würde.

es stellte sich heraus, wenn entweder die Quelle Aktivität A oder Zielaktivität B sind eine einzelne Instanz Start mit Modus, NEW_TASK Flag wird automatisch hinzugefügt:

if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 
     // The original activity who is starting us is running as a single 
     // instance... this new activity it is starting must go on its 
     // own task. 
     launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 
    } else if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE 
      || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) { 
     // The activity being started is a single instance... it always 
     // gets launched into its own task. 
     launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 
    } 

Da Sie beide Apps besitzen, sollten Sie sicherstellen können, dass diese Startmodi nicht in Manifest oder Absicht definiert sind.

Bis jetzt konnte ich keine andere Instanz des NEW_TASK-Flags finden, das ungewollt gesetzt wurde.

Verwandte Themen