如何将对象传递给新的Activity? (如何注射)

时间:2011-10-11 12:11:40

标签: android android-activity android-intent

我想将实现某个接口(例如IConnect)的对象(不是数据!)传递给新的Activity。 Activity将从此对象调用一些方法来获取数据。

怎么做? (Serializable和Parcelable是我想的对象/数据/结构,而不是'DO'的对象/接口)。

我应该在Intent extras中传递一个类名吗?然后Activity会创建所需的对象吗? 如何将一个对象(一些实现IConnect的不同类)注入一个新的Activity?

5 个答案:

答案 0 :(得分:4)

MyParcelable.java

public class MyParcelable implements Parcelable { 

    private String mVal; 

    public MyParcelable(String val) { 
        mVal = val; 
    } 

    public static final Parcelable.Creator<MyParcelable> CREATOR = 
        new Parcelable.Creator<MyParcelable>() { 
        public MyParcelable createFromParcel(Parcel in) { 
            String s = in.readString(); 
            return new MyParcelable(s); 
        } 

        public MyParcelable[] newArray(int size) { 
            return new MyParcelable[size]; 
        } 
    }; 

    public String getValue() { 
        return mVal; 
    } 

    public void writeToParcel(Parcel p) { 
        p.writeString(mVal); 
    } 

    public String toString() { 
        return "MyParcelable[val=" + mVal + "]"; 
    } 

} 

SendParcelable.java

public class SendParcelable extends Activity { 
    @Override 
    public void onCreate(Bundle icicle) { 
        super.onCreate(icicle); 
        Intent intent = new Intent(this, ReceiveParcelable.class); 
        Parcelable p = new MyParcelable("test"); 
        intent.putExtra("myparcelable", p); 
        Log.i("ParcelDemo", "Sending Parcelable"); 
        startActivity(intent); 
    } 
} 

ReceiveParcelable.java

public class ReceiveParcelable extends Activity { 
    @Override 
    public void onCreate(Bundle icicle) { 
      super.onCreate(icicle); 
      Intent intent = getIntent(); 
       Parcelable p = intent.getParcelableExtra("myparcelable"); 
        Log.i("ParcelDemo", "Got Parcelable " + p); 
        if (p != null && p instanceof MyParcelable && 
            ((MyParcelable) p).getValue().equals("test")) { 
            Log.i("ParcelDemo", "Success!"); 
        } else { 
            Log.i("ParcelDemo", "Failure!"); 
        } 
    } 
} 

希望这有帮助!

答案 1 :(得分:1)

Android文档中有一个条目 - How do I pass data between Activities/Services within a single application?如果您谈论的是非持久性对象,您的选项将是:

  • Singleton类
  • 公共静态字段/方法
  • WeakReferences to Objects的HashMap

顺便说一句,我并不完全理解你在对象和数据之间的区别。对象包含字段和一组使用它们的方法。但是,如果此对象具有某些方法并不重要,则它们不会成为其状态的一部分。如果传递一个对象,则只需要传递其状态,这样就可以使用序列化(通过Serializable或Parcelable接口)保存状态,然后将其恢复。

答案 2 :(得分:1)

如果您只是想找到一种在活动之间传递对象的方法,则可以覆盖Application类。

使用应用程序类的方法。

扩展应用程序类并将对象添加为其属性。在任何活动中,如果您调用以下代码,它将返回单个。

MyApplication appContext = (MyApplication) getApplication();

要完成此工作,您需要将其添加到清单文件的应用程序标记

 android:name=".MyApplication"

此方法用于在应用程序周围传递值和对象。

答案 3 :(得分:0)

Parcelable是一个选项。它将从您的对象写入数据并从数据中创建一个新对象。它就像保存和加载数据一样。

看看http://developer.android.com/reference/android/os/Parcelable.html,看看你应该如何实现它。

答案 4 :(得分:0)

目前,我为目的地活动做了:

    String className = getIntent().getStringExtra("com.myproject.ModelClass");
    IModel model = (IModel)Class.forName(className).newInstance();

我在Activity中有一个特定的实现。