Android 如何使用地块在意图之间传递外部对象

Android 如何使用地块在意图之间传递外部对象,android,android-intent,parcelable,parcel,Android,Android Intent,Parcelable,Parcel,我有一个名为Consts的自定义对象。它包括一些关于用户和外部库对象的信息。在用户身份验证后,我正在LoginActivity中创建Consts对象,我想将此对象传递给我的main活动 如何在意图之间传递包含外部对象的自定义对象 常量的一部分对象: public class Consts implements Parcelable { //Created by me. I can pass this object to MainActivity. UserInformat

我有一个名为
Consts
的自定义对象。它包括一些关于用户和外部库对象的信息。在用户身份验证后,我正在
LoginActivity
中创建
Consts
对象,我想将此对象传递给我的
main活动

如何在意图之间传递包含外部对象的自定义对象

常量的一部分
对象:

public class Consts implements Parcelable {

     //Created by me. I can pass this object to MainActivity. 
     UserInformationClass UserInfo = new UserInformationClass(); 

     //This is external object. 
     SweetAlertDialog AlertDialog;
     String AppVersion = "v2.0";
     String OSVersion = "";


     @Override
     public int describeContents() {
         return 0;
     }

     @Override
     public void writeToParcel(Parcel dest, int flags) {
         dest.writeParcelable(this.UserInfo, flags);
         dest.writeString(this.AppVersion);
         dest.writeString(this.OSVersion);
     }

     public Consts(SweetAlertDialog alert) {
          this.AlertDialog = alert;
     }

     protected Consts(Parcel in) {
         this.UserInfo = in.readParcelable(UserInformationClass.class.getClassLoader());
         this.AppVersion = in.readString();
         this.OSVersion = in.readString();
     }

     public static final Parcelable.Creator<Consts> CREATOR = new Parcelable.Creator<Consts>() {
         @Override
         public Consts createFromParcel(Parcel source) {
             return new Consts(source);
         }

         @Override
         public Consts[] newArray(int size) {
             return new Consts[size];
         }
     };
}
主要活动:

public class LoginActivity {


     Consts consts = new Consts(new SweetAlertDialog());
                       .
                       .

     private void LoginCompleted(JSONObject json) {
          consts.getUserInfo().setName("Cristiano");
          consts.getUserInfo().setSurname("Ronaldo");
          consts.getUserInfo().setTokenID("7");
          consts.getUserInfo().setTokenTimeOut("100");

          Intent i = new Intent(getApplicationContext(), MainActivity.class);
          i.putExtra("ConstsObject", consts);
          startActivity(i);
          finish();
     } 
}
public class MainActivity {

Consts consts;

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Bundle data = getIntent().getExtras();
    consts = (Consts) data.getParcelable("ConstsObject");
    //I can get consts object but consts.AlertDialog is null :(
}

不,您不能像@user1643723告诉您的那样传递外部对象

您可以使用
Singleton

//-- this must be your Consts file
public class Singleton {
    private static final Singleton instance = new Singleton();
    SweetAlertDialog AlertDialog;
    // Private constructor prevents instantiation from other classes
    private Singleton() {

    }

    public static Singleton getInstance() {
        return instance;
    }

    public SweetAlertDialog getAlertDialog() {
        if (AlertDialog == null)
            AlertDialog = new SweetAlertDialog();
        return AlertDialog;
    }

    public void setAlertDialog(SweetAlertDialog alertDialog) {
        AlertDialog = alertDialog;
    }

}
您可以访问任何地方:

Consts consts = Consts.getInstance();

检查我的答案:@DivyeshPatel,您的
对象只包含
字符串
值。我要传递外部对象。不能将不可包裹的对象放入包裹中。唯一可打包的对象是:绑定器对象(包括IInterface子类)、文件描述符(包装在ParcelFileDescriptor中后)、字节数组以及由可打包对象组成或可序列化为字节序列的任何对象。关于AlertDialog,您希望传递的是什么?里面的文字?布局?主题是什么?还有什么吗?这在Java中称为“静态字段”。这真的不是安卓特有的东西。您不能在意图中传递此类对象,但可以传递“订单”(enum或integer extra、Intent action string或Uri),这些订单建议接收活动、使用哪个静态对象以及如何处理它。请注意,静态对象可能会造成内存泄漏,除非将
null
分配给它们,否则它们不会被垃圾收集。所以,当你不再需要它们时,一定要把它们处理掉。理想情况下,您根本不希望在活动之间共享此类对象。这可能是重新考虑你的应用程序设计的好时机。在大多数情况下,你应该将重物作为单件物品。这和ContentProviders一样,您不必关闭它们,因为当系统终止您的进程时,它们将和您一起消亡。视图对象很棘手:如果没有大量ado,它们不能在活动之间传递;从理论上讲,您可以分离它们,传递它们,然后重新连接,但这通常不值得费心(您必须保留两个代码路径来创建和重用它们,所以每次都可以创建它们)。最好的策略是将所有可重用状态分开,并将其保存在Parcelable/singlton/database中。