我正在尝试使用从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,我知道这样会很容易,但是架构不允许我这样做。
答案 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()
),并根据需要更改/读取其值。