Java 从一个活动传递到另一个活动的永久对象

Java 从一个活动传递到另一个活动的永久对象,java,android,Java,Android,我必须将ArrayList从一个活动A传递到另一个活动B 我使用了getserializabletra和puttera方法。我已经知道这些方法的含义,但我不知道我使用它们传递的内容是否永久存储在新活动中,或者是否有必要重新加载活动A以检索B中的数据 所以问题是:如何在初始启动屏幕中加载数据,然后在所有其他活动中使用它,而不重新加载启动屏幕?您可以使用Preference类,在其中可以定义其静态实例。然后根据您想要的数据类型(甚至是ArrayList)创建变量。为此变量的get和set生成属性 在

我必须将
ArrayList
从一个活动A传递到另一个活动B

我使用了
getserializabletra
puttera
方法。我已经知道这些方法的含义,但我不知道我使用它们传递的内容是否永久存储在新活动中,或者是否有必要重新加载活动A以检索B中的数据


所以问题是:如何在初始启动屏幕中加载数据,然后在所有其他活动中使用它,而不重新加载启动屏幕?

您可以使用Preference类,在其中可以定义其静态实例。然后根据您想要的数据类型(甚至是ArrayList)创建变量。为此变量的get和set生成属性

在启动屏幕上设置该值,并在应用程序中找到您需要的任何地方


试试这个,如果你需要,我也会上传代码。

我已经写了一些关于这个的代码,它将帮助其他活动轻松获取数据,在数据不保密时使用它

public class HelperShared {

public static final String score = "Score";

public static final String tag_User_Machine = "tag_User_Machine",
        tag_Machine_Machine = "tag_Machine_Machine",
        tag_Draw_Machine = "tag_Draw_Machine",
        tag_Total_Machine = "tag_Total_Machine";


public static SharedPreferences preferences;
public static Editor editor;

public HelperShared(Context context) {
    this.preferences = context.getSharedPreferences(score,
            Activity.MODE_PRIVATE);
    this.editor = preferences.edit();
}

/*
 * Getter and Setter methods for Machine
 */
public void setUserMachine(int UserMachine) {
    editor.putInt(tag_User_Machine, UserMachine);
    editor.commit();
}

public void setMachineMachine(int MachineMachine) {
    editor.putInt(tag_Machine_Machine, MachineMachine);
    editor.commit();
}

public void setDrawMachine(int DrawMachine) {
    editor.putInt(tag_Draw_Machine, DrawMachine);
    editor.commit();
}

public void setTotalMachine(int TotalMachine) {
    editor.putInt(tag_Total_Machine, TotalMachine);
    editor.commit();
}

  public int getUserMachine() {
    return preferences.getInt(tag_User_Machine, 0);
}

public int getMachineMachine() {
    return preferences.getInt(tag_Machine_Machine, 0);
}

public int getDrawMachine() {
    return preferences.getInt(tag_Draw_Machine, 0);
}

public int getTotalMachine() {
    return preferences.getInt(tag_Total_Machine, 0);
}

}不要使用首选项类首选项仅用于设置值。要将数据传递给另一个活动,请使用
Serializable
Parcelable
。请记住,将传递给另一个活动的所有对象都必须实现可序列化或可打包。因此,您可以将ArrayList扩展到实现Parcelable或Serializable的自定义类

你这样做:

Intent intent = new Intent(getContext(), SomeClass.class);
intent.putSerializableExtra("value", <your serializable object>);
startActivity(intent);
//For setting
((MyApp) this.getApplication()).setAppLevelString("Test string");

//For getting
String str = ((MyApp) this.getApplication()).getAppLevelString();
或者在这里寻找包裹


在活动A中处理的数据不需要在活动B中再次处理。如果数据是在A中计算的,并且您将其发送给B computed,则B将收到已计算的数据

这里有一些正确的方法:

如果您的问题是“如何在初始启动屏幕中加载数据,然后在所有其他活动中使用它而不重新加载启动屏幕?”那么我有更好的解决方案

创建一个类Memdata.java

public class Memdata{

    private static Memdata instance = null; 
    private String userobject;

   public static Memdata getInstance(){
        if ( instance == null){
            instance = new Memdata();
        }
        return instance;
    }

   public String getuserobject() {
        return userobject;
    }

    public void setuserobject(String userobject) {
        this.userobject= userobject;
    }
}

在启动屏幕的onCreate方法上,设置值

Memdata obj=Memdata.getInstance()

obj.setuserobject(“你好”)


而不是在任何活动中,如果要访问此变量,只需创建其对象并获取值

就像在我的活动课上一样

 Memdata obj = Memdata.getInstance();

String str = obj.getuserobject()


您可以根据需要定义任何类型的变量。

您可以扩展基本
应用程序
类并向其添加成员变量:

public class MyApp extends Application {

    private String appLevelString;

    public String getAppLevelString() {
        return this.appLevelString;
    }

    public void setAppLevelString(String val) {
        this.appLevelString= val;
    }
}
您必须按如下方式更新清单文件:

<application android:icon="@drawable/icon"
             android:label="@string/app_name"
             android:name="MyApp">


我已经知道这些话题了,这不是我问题的重点。我知道如何在活动之间传递对象,但我不知道它们是否会在目标活动中持久化为什么不将ArrayList设置为全局变量,然后可以从任何活动中访问它?当你在splash中获取数据时,它将保持可访问性,直到应用程序运行。这是一个糟糕的方法!首选项应该只用于设置值,而不用于应用程序内部使用的数据。那么@mapo87,你有什么建议?谢谢@Pankaj的代码,但我不明白我是否也可以将非原始类型的数据放在共享首选项中。你是对的,传递非原始类型的数据会非常困难。您应该制作流程图,查看哪些是非冗余活动,并使用要向其传递数据的活动的静态变量将数据传递给下一个活动,这样您就可以确保所需的数据存在,如果数据不可用,您可以要求用户返回或采取必要的措施确定,这是我通常用于将数据从一个活动传递到另一个活动的方式,但我不知道从一个活动A传递到另一个活动B的数据在内存中是否持久。我的意思是,如果活动A计算数据,然后将其传递给活动B,那么活动B是否需要在我第二次调用它时重新计算而不传递A?当您只将对象传递给另一个活动时,为什么希望它是持久的?我编辑了计算数据问题的答案我希望数据是持久的,但是我不知道使用putExtra()方法它是否会持久化你说的持久化是什么意思,因为你需要什么持久化的东西?当你把它从A传递到B时,你不需要它是持久的。当你想从任何地方访问它时,你需要持久性,而不仅仅是在B中。当对象一旦被破坏时,保存的数据就会丢失。对象对象只是类和静态类型的实例。当应用程序关闭应用程序时,此对象将被销毁。是的,如果您在短时间后返回应用程序并希望访问该对象,则会出现内存泄漏或该对象的数据丢失。单例的最佳方法是例如服务:)需求是将数据从一个活动发送到另一个活动。因此,当您从活动返回或转到另一个活动时,意图数据也不再有效,但该类允许您使用此变量,直到您使用应用程序为止。否则,如果您想使用数据,当用户再次访问应用程序时,您必须将数据保存在文件或数据库中,然后通过
getApplication()
访问数据?这也是一种不好的方法。请阅读以下内容:正如前面提到的,通过
getApplication
访问数据是一种不好的模式,那么您建议共享参考吗?我已经阅读了您共享的文章,但我仍然会选择我在这里提到的方法,因为我使用if..else块。当我看到返回值为null时,我再次获取它并再次设置我的应用程序级别变量。
//For setting
((MyApp) this.getApplication()).setAppLevelString("Test string");

//For getting
String str = ((MyApp) this.getApplication()).getAppLevelString();