2016-07-19 17 views
1

Ich versuche, einen Wert aus Activity3 zu Activity1 abgerufen. Dies ist mein Flow:So senden Sie einen Wert zwischen mehreren Aktivitäten auf Android

Activity1 ruft Activity2 → Activity2.finish(), rufen Aktivität3 → Activity3.doSomethingAndGetValue() → Activity3.finish() → Activity1.useDoSomethingAndGetValue();

Ich kann den Weg nicht finden, die Werte von Activity3 zu Activity1 zurückzusenden; Selbst mit startActivityForResult(), weil Activity2 zu diesem Zeitpunkt bereits zerstört war.

Ich habe versucht, eine serialisierbare Schnittstelle zu verwenden und dies als zusätzlichen Wert für die Absicht übergeben, aber diese Lösung funktioniert nur mit dem übergebenen Objekt ist eine statische, die mir keine Änderung in den aktuellen Elementvariablen auf Aktivität 1.

Außerdem habe ich Erfolg, ohne all diese Möglichkeiten versucht:

https://stackoverflow.com/a/17306696/3217203

(ich zulassen, dass für dieses gemeinsame Präferenzen verwenden)

hat jemand eine hat Deine Idee?

Hinweis: Ich kann EventBus nicht hinzufügen, ich weiß, wäre toll und viel einfacher, aber die Architektur hat mir nicht erlaubt.

+0

[EventBus] (http://greenrobot.org/eventbus/) scheint hier anwendbar –

+0

Sie könnten 'startActivityForResult' versuchen, aber ein Event-Bus als @ cricket_007 vorgeschlagen könnte besser sein –

+0

BTW: Ich kann eventBus, ich nicht hinzufügen Ich weiß, es wäre großartig und viel einfacher, aber die Architektur hat es mir nicht erlaubt. –

Antwort

5

Sie könnten die Verwendung der Absicht Flagge machen wie FLAG_ACTIVITY_FORWARD_RESULT wie in Intent beschrieben, wenn Aktivitäten 2 und 3

-Code

Activity 1 -> startActivityForResult(activityB,0); 
Activity 2 -> activityCintent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); startActivity(activityCintent); finish(); 
Activity 3 -> setresult(10); finish(); 
Activity 1 -> if(result==10) {dofunction(); } 

dieses Ausgangs ist die Logik der FLAG_ACTIVITY_FORWARD_RESULT . Zuerst starten Sie eine Aktivität für das Ergebnis, eine neue Aktivität sendet diese Absicht an eine andere neue Aktivität, bis Sie das Ergebnis festgelegt haben.

+0

Das hat funktioniert, danke! –

0

Wenn Sie die Datenanforderung auf die drei Aktivitäten wie in Ihrer Beschreibung beschränkt ist, würde ich vorschlagen, activity2 nicht zu beenden, bevor Sie zu activity3 gehen. Nutzen Sie stattdessen die Aktivitäten startActivityForResult(). Wenn Sie von activity3 zu activity2 zurückkehren, rufen Sie finish() auf und kehren dann zu activity1 zurück.

Wenn die obige Lösung nicht akzeptabel ist, versuchen Sie die folgenden zwei Ansätze:

(1) Sie Variablen mit einem Anwendungskontext verwenden könnte. Dazu wird zunächst eine Anwendungsklasse schaffen sagen MyApp.java,

public class MyApp extends Application { 

private String data; 

public String getData() { 
     return data; 
    } 

    public void setData(String data) { 
     this.data = data; 
    } 
} 

nun diese Klasse als android:name für die Anwendung Tag in manifest, fügen

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.tony.myapp"> 

<application 
    android:name=".MyApp" 
    .....> 

Im Aktivität3,

String data = "I am BATMAN!!"; 
MyApp myApp = (MyApp) getApplicationContext(); 
myApp.setData(data); 

Dann alles, was Sie in der Activity1 tun müssen, ist

MyApp myApp = (MyApp) getApplicationContext(); 
String data = myApp.getData(); 

(2) Wenn Sie einfache Schlüssel-Wert-Paare, die Sie verschiedene Instanzen der App bestehen bleiben möchten, verwenden Sie SharedPreferences.

0

U kann setter und Getter pojo Klasse

SetValues ​​von tätigkeit3 verwenden und sie in Tätigkeit 1 verwenden.

public class MyPojo { 
    private static String value; 
    public static String getValue() { 
    return value; 
     } 
    public static void setValue(String value) 
    { 
      MyPojo.value = value; 
     } 
} 

Im Aktivität3,

MyPojo.setValue ("Dies ist tätigkeit3");

Dann im Activity1,

MyPojo.getValue();

+0

Okay, Sie müssten jedoch das POJO zwischen den Aktivitäten passieren. Es sei denn, Sie schlagen einen Singleton vor? –

0

Wie Tony vorgeschlagen hat, können Sie die App-Klasse (die ein Singleton ist) verwenden, aber ich würde eine andere Singleton-Klasse, speziell für Ihren Zweck erstellen. So ...

public class Singleton { 
    private static Singleton INSTANCE = null; 
    private String aValue; 
    private int bValue; 
    private Object cValue; 

    private Singleton(){ 

    } 

    public static Singleton getInstance(){  
     if(INSTANCE == null){ 
      INSTANCE = new Singleton(); 
     } 
     return INSTANCE; 
    } 
    //Setters and getters here 
} 

Auf diese Weise können Sie die gleiche Instanz erhalten können (durch die statische Methode mit Singleton.getInstance()) in allen Aktivitäten und ändern/lesen ihre Werte, wie Sie benötigen.