【问题标题】:How to pass object to a new Activity? (how to inject)如何将对象传递给新的活动? (如何注入)
【发布时间】:2011-10-11 12:11:40
【问题描述】:

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

如何做到这一点? (我猜,Serializable 和 Parcelable 适用于对象/数据/结构,而不适用于“做”某事的对象/接口)。

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

【问题讨论】:

    标签: android android-activity android-intent


    【解决方案1】:

    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!"); 
            } 
        } 
    } 
    

    希望这会有所帮助!

    【讨论】:

    • 感谢您提供全面的示例 :) 现在,我决定使用: String className = getIntent().getStringExtra("com.myproject.ModelClass"); IModel 模型 = (IModel)Class.forName(className).newInstance();
    【解决方案2】:

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

    • 单例类
    • 公共静态字段/方法
    • 对象弱引用的 HashMap

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

    【讨论】:

    • 但我不想传递数据(我知道如何使用捆绑/包裹)。我想传递实现某些接口并执行某些操作的对象(例如根据实现连接到互联网/其他资源)
    • 为什么要传递一个不包含数据的对象?然后创建一个新的。如果它真的没有内部状态,那么它会像旧的一样运行。
    • 因为这个对象做了一些事情,所以它实现了一些接口
    • 你是什么意思,做什么?它有方法吗?还是正在做某事?
    • 它有一些需要做逻辑的方法。我可以在 Activity 中使用带有参数的工厂,或者只是从类名创建一个新对象(我已经发布了回复)
    【解决方案3】:

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

    应用类的使用方法。

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

    MyApplication appContext = (MyApplication) getApplication();
    

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

     android:name=".MyApplication"
    

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        现在,我为目的地活动做了:

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

        而且我在 Activity 中有一个特定的实现动作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多