【问题标题】:Passing custom objects between activities?在活动之间传递自定义对象?
【发布时间】:2011-08-03 00:43:01
【问题描述】:

如何在 android 的 Activity 之间传递自定义对象?我知道捆绑包,但我似乎在其中看不到任何功能。谁能给我一个很好的例子吗?

【问题讨论】:

    标签: java android


    【解决方案1】:

    在活动之间传递对象或使对象对所有应用程序通用的一种简单方法是创建一个扩展应用程序的类。

    这是一个例子:

    public class DadosComuns extends Application{
    
        private String nomeUsuario="";
    
        public String getNomeUsuario() {
            return nomeUsuario;
        }
    
        public void setNomeUsuario(String str) {
            nomeUsuario = str;
        }
    }
    

    在所有其他活动中,您只需实例化一个对象“DadosComuns”,声明为全局变量。

    private DadosComuns dadosComuns;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
    
        //dados comuns
        dadosComuns = ((DadosComuns)getApplicationContext());
    
        dadosComuns.setNomeUsuario("userNameTest"); }
    

    您实例化的所有其他活动 dadosComuns = ((DadosComuns)getApplicationContext()); 您可以访问 getNomeUsuario() == "userNameTest"

    在你的 AndroidManifest.xml 你需要有

    <application
            android:name=".DadosComuns"
    

    【讨论】:

      【解决方案2】:

      你应该实现Parcelable interface

      链接到documentation

      【讨论】:

      • 为什么不能打包发送对象?我的意思是,为什么Android不支持它?所有活动都在同一个进程中运行,所以支持它不是很容易吗?
      • @Enigma 我想我明白了你的问题。如果你的意思是在bundle中“传递对对象的引用”,那么这是一个坏主意,因为创建对象的Activity可能会由于内存不足而被销毁,并且对象将会丢失。
      • 如果有一个对象的引用,它不会被销毁!我认为应该有比垃圾收集更技术的东西,关于这个!
      • @EhsanMirsaeedi 如果您的引用阻止封闭对象被垃圾收集,那么您有内存泄漏。
      • @Igor Filippov 链接已死
      【解决方案3】:

      使用 Parcelable 接口,您可以将自定义 java 对象传递给 Intent。

      1) 为您的类实现 Parcelable 接口,例如:

      class Employee implements Parcelable
      {
      }
      

      2) 将 Parcelable 对象传递到 Intent 中,例如:

      Employee mEmployee =new Employee();
      Intent mIntent = new Intent(mContect,Abc.class);
      mIntent.putExtra("employee", mEmployee);
      startActivity(mIntent);
      

      3) 将数据放入新的 [Abc] Activity 中,例如:

      Intent mIntent  = getIntent();
      Employee mEmployee  = (Employee )mIntent.getParcelableExtra("employee");
      

      【讨论】:

        【解决方案4】:

        Parcel 可能会解决您的问题。

        Parcel 视为原始类型(long、String、Double、int 等)的“数组”(隐喻)。 如果您的自定义类仅原始类型组成,则更改您的类声明,包括implements Parcelable

        你可以毫无困难地通过一个意图传递一个可打包的对象(就像你发送一个原始类型的对象一样)。在这种情况下,我有一个名为 FarmDataparcelable 自定义类(由 longs、strings 和 doubles 组成),我通过 Intent 从一个活动传递到另一个活动。

            FarmData farmData = new FarmData();
        // code that populates farmData - etc etc etc
            Intent intent00 = new Intent(getApplicationContext(), com.example.yourpackage.yourclass.class);
            intent00.putExtra("farmData",farmData);
            startActivity(intent00);    
        

        但检索它可能会很棘手。接收意图的活动将检查是否与意图一起发送了额外的捆绑包。

            Bundle extras = getIntent().getExtras();
            FarmData farmData = new FarmData();
            Intent intentIncoming = getIntent();
            if(extras != null) {
                farmData = (FarmData) intentIncoming.getParcelableExtra("farmData");// OK
            }
        

        【讨论】:

          【解决方案5】:

          给定一个在整个对象树中实现 Serializable 的对象 PasswordState,您可以将该对象传递给另一个活动,如下所示:

          private void launchManagePassword() {
              Intent i= new Intent(this, ManagePassword.class); // no param constructor
              PasswordState outState= new PasswordState(lengthKey,timeExpire,isValidKey,timeoutType,"",model.getIsHashPassword());
              Bundle b= new Bundle();
              b.putSerializable("jalcomputing.confusetext.PasswordState", outState);
              i.putExtras(b);
              startActivityForResult(i,REQUEST_MANAGE_PASSWORD); // used for callback
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-01-05
            • 2014-12-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多