Android中Activity之间参数传递

来源:互联网 发布:电脑抽奖软件下载 编辑:程序博客网 时间:2024/05/17 03:44

Intent:一直穿梭在Activity之间,它不光只是为了使Activity之间进行跳转。在跳转的时候,还可以进行Acivity之间的参数传递。

下面举几个列子。以MianActivity,TheActivity为例子。


    MianActivity类

    Intent i  = new Intent(MianActivity.this,TheActivity.class);

    //这里就可以传入你想要传递的参数了,第一个参数是数据名,可以根据自己爱好或者工作需求命名。第二个就是传递的参数,可以是字符串,int值,也就是数据基本类型。

    i.putExtra("name","小猫");

    i.putExtra("age","18");

    startActivity(i);         

    TheAcivity类

     Intent i = getIntent();

    String name = i.getStringExtra("name");

    String age = i.getStringExtra("age");

    这样就可以得到你想要从MianAcitivity传入的参数。


    上面说的是传递简单的数据基本类型,可现实往往不会被它们所满足,当数据比较多的时候,这样的传递就会显得比较复杂。于是,Android推出了一个新的概念,数据包(Bundle)。

    MianActivity类

    Intent i  = new Intent(MianActivity.this,TheActivity.class);

    Bundle b = new Bundle();

    b.putString("name", "小猫");
    b.putInt("age", 13);

    i.putExtras(b);

    TheAcivity类

     Intent i = getIntent();

     Bundle data = i.getExtras();

    tv.setText(String.format("name=%s,age=%d,name1=%s", data.getString(age),data.getStringArray(name),data.getString("name1", "leo")));

    在这里,你会发现。从Activity中,并没有传入name1。所以在这里我给了它他一个默认值(leo);


    defaultValue:表示在传入的参数为空的时候,可以默认一个写入一个参数

     这个时候的运行结果:

                                                                                              


   当我们给我一个值得时候

    b.putInt("name1", "iwen");

    这个时候的运行结果:



      Bundle还有一种传递方式

    MianActivity类

    Intent i  = new Intent(MianActivity.this,TheActivity.class);

    Bundle b = new Bundle();

    b.putString("name", "小猫");
    b.putInt("age", 13);

    // i.putExtras(b);

    i.putExtra(“data”,b);

    TheAcivity类

     Intent i = getIntent();

     // Bundle data = i.getExtras();

     Bundle data = i.getBundleExtra("data");

    tv.setText(String.format("name=%s,age=%d,name1=%s", data.getString(age),data.getStringArray(name),data.getString("name1", "leo")));

    运行结果同上。

    可能在这上面,你并不满足,因为他达不到你所有的需求。而且看起数据比较扎乱。比如,如何传入实体类(自定义)的数据

    首先,建造一个实体类

    public class User {
    
    private String name;
    private int age;
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
   public User(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    } 
      MianActivity类

    Intent i  = new Intent(MianActivity.this,TheActivity.class);

    i.putExtra("User", new User("小猫", 2));

   startActivity(i);

    当这样写的时候,程序就会报错,因为i.putExrra();方法不支持传入一个实体类(自定义),需要实例化。怎么解决呢?这个时候,系统就会给我们两个选择。

                                                                                                                   

       第一个,实体类实现序列化,修改实体类

    public class User implements Serializable{
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public User(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    这样,MianActivity类就不会报错了,现在就只剩下TheAcivity类,取数据。

    TheAcivity类

     Intent i = getIntent();

     User user = (User) i.getSerializableExtra("User");

     tv.setText(String.format("User info(anme=%d,age=%s)", user.getName(),user.getAge()));


    第二个,使用android自己提供的序列化(Parcelable)。使用这个接口,他需要实现连个发describeContents();writeToParcel();修改实体类(自定义)

    public class User implements Parcelable{
    
    private String name;
    private int age;
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public User(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    //不用管
    @Override
    public int describeContents() {
        return 0;
    }
    //因为Parcelable没有全自动话的序列机制,所以需要自己手写。
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(getName());
        dest.writeInt(getAge());
    }
    
    public static final Creator<User> CREATOR = new Creator<User>() {
        
        @Override
        public User createFromParcel(Parcel source) {
            //当数据类型多的时候,或者大量相同数据类型的时候,可以使用source.readBundle();方法
            return new User(source.readString(), source.readInt());
        }

        @Override
        public User[] newArray(int size) {
            return new User[size];
        }
    };
     这个时候只需要稍微修改一下TheAcivity类就可以了

    TheAcivity类

     Intent i = getIntent();

     User user =i.getParcelableExtra("User");

     tv.setText(String.format("User info(anme=%d,age=%s)", user.getName(),user.getAge()));


    这两种方式有何区别呢?第一种Serializable操作简单,一切都是由系统帮助程序系列化,它的缺点就是运行慢。速度慢。第二种Parcelable是android提供的接口,操作比较复杂,但它的速度是非常快的,因为很多东西都是需要自己写的。

    如何将TheAcivity类的数据返回给MainActivity类呢?


        Intent i = new Intent();
        //这里可以写你想要出入的参数
        i.putExtra("data", tv.getText().toString());
        //第一个参数代表请求码,这里的1代表返回结果成功。第二个参数代表放回的数据
        setResult(1,i);

       ​MianActivity

    ​    ​这个时候startActivity();方法已经不行了,需要换成

       ​ startActivityForResult(i, 0);//第一个参数代表返回的数据,第二个参数代表参数状态。

    ​    ​还需要重写onActivityResult()方法将返回结果进行处理、分析。

    ​    ​//第一个参数代表请求码,根据它可以判断请求的意义是什么。第二个参数代表返回码,根据它可以判断放回的状态。第三个参数代表返回值
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // 这里可以获取返回的数据data
        super.onActivityResult(requestCode, resultCode, data);
    }

这样就可以得到你想要从MianAcitivity传入的参数。


 %在跳转的时候,需要在AndroidManifest.xml中为你Activity注册。<activity android:name="com.example.intentstartactivity.TheActivity"></activity>%

新手初入,望。大神指点,同行留言交流。


0 0