如何在Android上的多个活动之间发回值

时间:2016-07-19 17:36:47

标签: android android-intent android-activity

我正在尝试使用从Activity3检索到Activity1的值。 这是我的流程:

  

Activity1调用Activity2→Activity2.finish(),调用Activity3→   Activity3.doSomethingAndGetValue()→Activity3.finish()→   Activity1.useDoSomethingAndGetValue();

我找不到将值从Activity3发送回Activity1的方法;甚至使用startActivityForResult(),因为到那时Activity2已经被破坏了。

我尝试使用可序列化的接口并将其作为intent的额外值传递,但此解决方案仅适用于传递的对象是静态的,这不允许我对Activity 1上的当前成员变量进行任何更改

此外,我尝试了所有这些选项但没有成功:

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

(我不允许对此使用共享首选项)

有没有人有任何想法?

注意:我无法添加eventBus,我知道这样会很容易,但是架构不允许我这样做。

4 个答案:

答案 0 :(得分:5)

您可能希望在启动活动2和3时使用意图标记 FLAG_ACTIVITY_FORWARD_RESULT ,如Intent中所述。

<强>代码

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(); } 

这是FLAG_ACTIVITY_FORWARD_RESULT的逻辑。首先,您为结果启动活动,新活动会将此意图发送到另一个新活动,直到您设置结果。

答案 1 :(得分:0)

如果您的数据要求仅限于描述中的三个活动,我建议,在转到activity3之前不要完成activity2。相反,请使用startActivityForResult()活动。从activity3返回到activity2时,调用finish()然后返回activity1。

如果上述解决方案不可接受,请尝试以下两种方法:

(1)您可以将变量与应用程序上下文一起使用。 为此,首先创建一个Application类,例如MyApp.java,

public class MyApp extends Application {

private String data;

public String getData() {
       return data;
   }

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

现在,将此类添加为清单

中的应用程序标记android:name
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.tony.myapp">

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

在Activity3中,

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

然后,你需要在Activity1中做的只是,

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

(2)如果您想要保留应用的不同实例的简单键值对,请使用SharedPreferences

答案 2 :(得分:0)

你可以使用setter和getter pojo类

来自activity3的setvalues并在活动1中使用它们。

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

在Activity3中,

  

MyPojo.setValue(“this is activity3”);

然后在Activity1中,

  

MyPojo.getValue();

答案 3 :(得分:0)

正如Tony建议您可以使用App类(这是一个单例),但我会创建另一个单独的类,特定于您的目的。像这样......

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
}

通过这种方式,您可以在所有活动中获得相同的实例(通过使用静态方法Singleton.getInstance()),并根据需要更改/读取其值。