您的位置:首页 > 移动开发 > Android开发

Android中Activity之间参数传递

2016-08-17 16:49 369 查看
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>%

新手初入,望。大神指点,同行留言交流。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: