Intent -- 傳遞數(shù)據(jù)

1、Intent 可以傳遞的數(shù)據(jù)類型

Intent和IntentFilters(1) 中我們知道了通過 Intent 的putExtra( ) 方法可以實(shí)現(xiàn)組件之間的數(shù)據(jù)傳遞。那么putExtra( ) 方法能夠傳遞的數(shù)據(jù)類型由哪些限制呢?

下面這張圖是我從AndroidSrudio中截取的,這張圖里列出了所有可以通過intent傳遞的數(shù)據(jù)類型。


putExtra.png

根據(jù)這張圖可以看出,intent 對(duì)象可以傳遞的具體數(shù)據(jù)類型以及使用的方法。

(1) putExtra( key , value ) 方法

  • 可以傳遞 8 種基本數(shù)據(jù)類型以及這八種基本數(shù)據(jù)類型的數(shù)組,
  • 可以傳遞 Serializable 實(shí)現(xiàn)類的對(duì)象,
  • 可以傳遞Parcelable 實(shí)現(xiàn)類的對(duì)象和數(shù)組,
  • 可以傳遞Bundle 對(duì)象

(2) putExtras( value )方法

  • 可以傳遞Bundle 對(duì)象,
  • 可以傳遞Intent 對(duì)象

(3) Intent 也可以直接傳遞集合

  • 傳遞 Integer類型 的集合可以直接使用:putIntegerArrayListExtra( key,value)
  • 傳遞 String 類型 的集合可以直接使用: putStringArrayListExtra( key , value)
  • 傳遞 CharSequence 類型 的集合可以直接使用: putCharSequenceArrayList( key , value)
  • 傳遞 ** Parcelable 類型** 的集合可以直接使用 :putParcelableArrayList( key,value)

2 Intent 傳遞數(shù)據(jù)的示例代碼

(1) 傳遞基本數(shù)據(jù)類型數(shù)據(jù)

  • IntentUseActivity.java 數(shù)據(jù)發(fā)送方
public class IntentUseActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_intent_use);

        Button btn_forResult = (Button) findViewById(R.id.btn_forResult);
        btn_forResult.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(IntentUseActivity.this, TestActviity.class);
                intent.putExtra("name","張三"); 
                startActivity(intent); 
            }
        });
    }
}

putExtra(key,value) 中兩個(gè)參數(shù)的含義分別是:

  • “name” , 表示 鍵名,TestActivity中獲取數(shù)據(jù)時(shí)要以鍵名為條件;
  • “張三”,表示具體要傳遞的值,需要注意的是,這里的值是什么類型,在 TestActivity 中就要用對(duì)應(yīng)類型的getXXXExtra( key ) 來取值,XXX就是這里值的數(shù)據(jù)類型。具體參考下面的代碼
  • TestActviity.java 數(shù)據(jù)接收方
public class TestActviity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_testactivtiy);

        //getIntent 獲取上一個(gè)界面?zhèn)鬟f的intent對(duì)象,然后用 getStringExtra( ) 拿到具體數(shù)據(jù)
        String name = getIntent().getStringExtra("name");

        Toast.makeText(this, "獲取到上一個(gè)界面?zhèn)鬟f過來的數(shù)據(jù)是:" + name, Toast.LENGTH_SHORT).show();
    }
}

在這段代碼中,先通過getIntent( )方法獲取到上一個(gè)界面?zhèn)鬟f的intent對(duì)象,然后由于intent 中傳遞的數(shù)據(jù)是字符串類型的“ 張三”,所以此處使用getStringExtra( key) 來獲取數(shù)據(jù),又由于 intent中定義的鍵名是“name” ,所以此處getStringExtra( ) 傳入的參數(shù)就是 name.

(2) 傳遞基本數(shù)據(jù)類型的數(shù)組

  • IntentUseActivity.java 數(shù)據(jù)發(fā)送方

public class IntentUseActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_intent_use);

    Button btn_forResult = (Button) findViewById(R.id.btn_forResult);
    btn_forResult.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(IntentUseActivity.this, TestActviity.class);

            String[] names = new String[]{"張三", "李四", "王五", "趙二麻子"};
            intent.putExtra("namesArray", names);
            startActivity(intent);
        }
    });
}

}


* TestActviity.java  數(shù)據(jù)接收方

public class TestActviity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_testactivtiy);

    String []names = getIntent().getStringArrayExtra("namesArray");
    
    //字符串?dāng)?shù)組轉(zhuǎn)字符串,并將兩端的[] 替換掉
    String str=Arrays.toString(names).replaceAll("[\\[\\]\\s,]", "");
    Log.e("上一個(gè)界面?zhèn)鬟f過來的數(shù)據(jù):",str);
}

}

>注意:
> * 在接收方獲取intent 中傳遞的數(shù)組時(shí)需要使用 getXXXArrayExtra(key), XXX由數(shù)組的成員類型決定,key 就是 intent 中putExtra()中的key.
> * 將數(shù)組轉(zhuǎn)成字符串的時(shí)候,可以直接使用  Arrays.toString( ) ,傳入要轉(zhuǎn)換的數(shù)組;使用這個(gè)方法轉(zhuǎn)換之后,會(huì)在兩端帶有 [ ] , 所以可以使用 replaceAll("[\\[\\]\\s,]", "") 將其替換成空串。

###(3)  傳遞 bean 對(duì)象
如果需要使用 intent 傳遞一個(gè)bean對(duì)象,有如下幾種方式:
>* A
讓該bean 類實(shí)現(xiàn)Serializable 接口,然后使用putExtra( key,value)傳遞
* B
讓bean 實(shí)現(xiàn)Parcelable 接口,然后使用putExtra( key,value)傳遞
* C
將bean對(duì)象中的數(shù)據(jù)分別通過Bundle對(duì)象的putXXX( )方法存進(jìn)bundle 對(duì)象,然后在用intent 的puExtra(key,bundle) 或 putExtras(bulde) 方法傳遞bundle對(duì)象。(這種方法不如前兩種來的直接,所以,我一般不喜歡這種) 

####1)讓bean 類實(shí)現(xiàn)Serializable 接口
Serializable 表示序列化,普通的bean類直接實(shí)現(xiàn)Serializable 接口后就可以將該bean類 的對(duì)象序列化成可存儲(chǔ)或者可傳輸?shù)臓顟B(tài)。(普通的bean類不可以直接在組件之間傳輸)
* 創(chuàng)建User 類,讓該類實(shí)現(xiàn)Serializable 接口

public class User implements Serializable {
public String name;
public String sex;
public int age;

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getSex() {
    return sex;
}

public void setSex(String sex) {
    this.sex = sex;
}

}

* IntentUseActivity.java 數(shù)據(jù)發(fā)送方

public class IntentUseActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_intent_use);

    Button btn_forResult = (Button) findViewById(R.id.btn_forResult);
    btn_forResult.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(IntentUseActivity.this, TestActviity.class);
            User user = new User();
            user.setAge(27);
            user.setName("張三");
            user.setSex("女");

             //直接將user對(duì)象作為value
            intent.putExtra("SerializableBean", user);   
            startActivity(intent);
        }
    });
}

}


* TestActivity.java

public class TestActviity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_testactivtiy);

    User user = (User) getIntent().getSerializableExtra("SerializableBean");
    
    
    Log.e("上一個(gè)界面?zhèn)鬟f過來的數(shù)據(jù):",user.getName()+user.getAge()+user.getSex());
}

}

* Log 中的結(jié)果:
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/2551993-445bc38e9750d9b7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

> 這里并沒有什么特殊的,只是單純的讓一個(gè)普通的bean類實(shí)現(xiàn)了Serializable 接口,這樣就可以 用 intent 傳遞這個(gè)bean 類的對(duì)象了。
> 在接收數(shù)據(jù)的時(shí)候,我們使用的是getSerializableExtra( )方法,得到一個(gè)Serializable 對(duì)象,然后向下強(qiáng)轉(zhuǎn)得到 user 對(duì)象

####2) 讓bean 實(shí)現(xiàn)Parcelable 接口
parcel 是打包的意思,所以parcelable 也就是可以打包的,與Serializable 相反,Parcelable 是將bean 類中的數(shù)據(jù)拆分之后,重新打包并存儲(chǔ)進(jìn)Parcel 類中。

* 創(chuàng)建User類,讓User類實(shí)現(xiàn)Parcelable 接口,并重寫方法

public class User implements Parcelable {
public String name;
public String sex;
public int age;
public boolean isAdult;

public boolean getIsAdult() {
    return isAdult;
}

public void setIsAdult(boolean isAdult) {
    this.isAdult = isAdult;
}


public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getSex() {
    return sex;
}

public void setSex(String sex) {
    this.sex = sex;
}

@Override
public int describeContents() {
    return 0;    //直接返回0就好
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    //將數(shù)據(jù)寫到Parcel中
    dest.writeString(name);
    dest.writeString(sex);
    dest.writeInt(age);

    //boolean類型的數(shù)據(jù)使用這種方式write到parcel中
    dest.writeByte(isAdult ? (byte) 1 : (byte) 0);  
}

// 創(chuàng)建Creator 常量,讀取Parcel 中的數(shù)據(jù)
public static final Parcelable.Creator<User> CREATOR= new Creator<User>() {
    @Override
    public User createFromParcel(Parcel source) {
        User user=new User();
        user.name=source.readString();
        user.sex=source.readString();
        user.age=source.readInt();

        //boolean 類型的數(shù)據(jù)使用這種方式讀取
        user.isAdult=source.readByte()==1;  
        return user;
    }

    @Override
    public User[] newArray(int size) {
        return new User[size];  //返回一個(gè)size 大小的 User數(shù)組
    }
};

}

> 注意:
A:
我們讓User類實(shí)現(xiàn)了Parcelable接口之后,需要重寫其中的describeContents()方法,該方法的返回值通常直接給0就好;需要重寫writeToParcel( ) ,將user 對(duì)象中的數(shù)據(jù)存儲(chǔ)到Parcel 中;最后還需要?jiǎng)?chuàng)建一個(gè) Parcelable.Creator 類型的常量,并在Creator 的構(gòu)造方法中的createFromParcel( ) 方法中,讀取存儲(chǔ)在Parcel 中的數(shù)據(jù),**此處尤為注意:readXXX ( )的順序必須和writeXXX( )的順序保持一致,否則數(shù)據(jù)會(huì)錯(cuò)位**

>B:
writeToParcel( ) 方法中,我們要寫到Parcel中的數(shù)據(jù)是什么類型,那么就用什么類型的writeXXX 。比如,我們定義的name 是String 類型,那么就需要使用writeString( name) ;同理,在createFromPacel( ) 中讀取數(shù)據(jù)的時(shí)候也是這樣子,數(shù)據(jù)是String 類型,就用readString( ) 。除boolean類型和char外,其他基本數(shù)據(jù)類型都可遵從該規(guī)律, boolean 類型的寫法參考C,Parcel 中沒有直接讀取char的方法

>**C:
>Parcel 中,也沒有直接讀取和寫出 boolean類型數(shù)據(jù)的方法.所以在 write 和 read boolean類型的數(shù)據(jù)時(shí)就需要借助Byte 。因Byte 占兩個(gè)字節(jié),要么0 要么1 ,這就和Boolean的要么true要么false 極為相似,所以,我們?cè)趙rite 的時(shí)候,判斷isAdult 是true 還是false, 如果true 就寫出字節(jié)1 ,如果false 就寫出 字節(jié) 0。在read 的時(shí)候,我們只需要判斷讀到的數(shù)據(jù)是否等于1 即可,等于1 isAdult 就是true,否則就是 false** 。


* IntentUseActivity.java 數(shù)據(jù)發(fā)送方

public class IntentUseActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_intent_use);

    Button btn_forResult = (Button) findViewById(R.id.btn_forResult);
    btn_forResult.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(IntentUseActivity.this, TestActviity.class);
            
            User user = new User();
            user.setAge(27);
            user.setName("張三");
            user.setSex("女");
            user.setIsAdult(true);
            intent.putExtra("ParcelableBean", user);
            startActivity(intent);
        }
    });
}

}

>

* TestActviity.java 數(shù)據(jù)接收方

public class TestActviity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_testactivtiy);

     //此處獲取數(shù)據(jù)的時(shí)候, 使用 getParcelableExtra(key)
    User user = (User) getIntent().getParcelableExtra("ParcelableBean");
    
    Log.e("上一個(gè)界面?zhèn)鬟f過來的數(shù)據(jù):",user.getName()+user.getAge()+user.getSex()+user.isAdult);
}

}

* 運(yùn)行結(jié)果

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/2551993-1182e3c1ae96211b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

####3)使用Bundle 傳遞(對(duì)象)數(shù)據(jù)
使用bundle 傳遞數(shù)據(jù)時(shí),有如下兩種情況:
**A**
 如果要傳遞的數(shù)據(jù)是一個(gè)bean對(duì)象,那么該bean類必須先實(shí)現(xiàn)Serializable 接口或者Pacelable 接口,然后通過putSerializable(key,value) 或者 putParcelable(key,value) 將對(duì)象封裝進(jìn)bundle ,然后在通過 Intent 的putExtra(key,value) 或者putExtras(bundle) 傳遞給下一個(gè)界面。示例代碼如下(這里只給出bean類實(shí)現(xiàn)Serializable 接口的代碼):
* 創(chuàng)建User 類,并實(shí)現(xiàn)Serializable 接口

public class User implements Serializable {
public String name;
public String sex;
public int age;
public boolean isAdult;

public boolean getIsAdult() {
    return isAdult;
}

public void setIsAdult(boolean isAdult) {
    this.isAdult = isAdult;
}

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getSex() {
    return sex;
}

public void setSex(String sex) {
    this.sex = sex;
}

}

* IntentUseActivity.java 數(shù)據(jù)發(fā)送方

public class IntentUseActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_intent_use);

    Button btn_forResult = (Button) findViewById(R.id.btn_forResult);
    btn_forResult.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(IntentUseActivity.this, TestActviity.class);

            User user=new User();
            user.setName("張三");
            user.setSex("女");
            user.setAge(27);
            user.setIsAdult(true);
            
            //創(chuàng)建bundle 對(duì)象,封裝數(shù)據(jù)
            Bundle bundle = new Bundle();
            bundle.putSerializable("UserBean",user);
            
            //用intent傳遞bundle 對(duì)象
            intent.putExtra("bundleBean", bundle);
            // intent.putExtras(bundle);

            startActivity(intent);
        }
    });
}

}


* TestActviity.java 數(shù)據(jù)接收方

public class TestActviity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_testactivtiy);

    Bundle bundle = getIntent().getBundleExtra("bundleBean");
    //Bundle bundle = getIntent().getExtras();

    User user = (User) bundle.getSerializable("UserBean");
    
    Log.e("上一個(gè)界面?zhèn)鬟f過來的數(shù)據(jù):", user.getName() + user.getAge() + user.getSex() + user.isAdult);
}

}



**B**
如果你沒有預(yù)定義bean類,只是想通過bundle 傳遞數(shù)據(jù),那么就先創(chuàng)建 Bundle對(duì)象,然后用bundle 的putXXX(key,value) 方法,將數(shù)據(jù)封裝進(jìn)bundle ,然后再通過intent  的putExtra(key,value) 或者 putExtras(bundle) 傳遞給下一個(gè)界面。對(duì)應(yīng)代碼如下:
* IntentUseActivity.java 數(shù)據(jù)發(fā)送方

public class IntentUseActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_intent_use);

    Button btn_forResult = (Button) findViewById(R.id.btn_forResult);
    btn_forResult.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(IntentUseActivity.this, TestActviity.class);

            //創(chuàng)建bundle 對(duì)象,封裝數(shù)據(jù)
            Bundle bundle = new Bundle();
            bundle.putString("name", "張三");
            bundle.putString("sex", "女");
            bundle.putInt("age", 27);
            bundle.putBoolean("isAdult", true);
            

            //用intent傳遞bundle 對(duì)象
            intent.putExtra("bundleBean", bundle);
            // intent.putExtras(bundle);

            startActivity(intent);
        }
    });
}

}

* TestActviity.java 數(shù)據(jù)接收方

public class TestActviity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_testactivtiy);

    Bundle bundle = getIntent().getBundleExtra("bundleBean");
    //Bundle bundle = getIntent().getExtras();

    Log.e("上一個(gè)界面?zhèn)鬟f過來的數(shù)據(jù):", bundle.getString("name") + bundle.getInt("age") + bundle.getString("sex") + bundle
            .getBoolean("isAdult"));

}

> 注意:
**A**
**Intent 傳遞 bundle 對(duì)象時(shí)有兩種方法,一種是putExtra(key,bundle) , 對(duì)應(yīng)的獲取方法是 getBundleExtra(key) ; 另外一種是 putExtras(bundle) ,對(duì)應(yīng)的獲取方法是 getExtras( )。**
>
**B**
實(shí)際開發(fā)中,在intent中使用bundle 作為數(shù)據(jù)載體的方式并不常用,因?yàn)檫@樣并不比使用intent 的putXXX 方便,這里主要是為了介紹這種思路以及怎么用bundle 存儲(chǔ)數(shù)據(jù);其實(shí)Bundle 更多的是用在 onSaveInstaceState( ) 方法中,確保activity頁面關(guān)閉時(shí)能夠保存數(shù)據(jù),具體的使用方法,后期會(huì)有相應(yīng)的文章介紹

















###(4) 傳遞 Bean 對(duì)象的集合
最近的項(xiàng)目中就用到了這種方式,需要在組件之間傳遞一個(gè) bean 對(duì)象的集合,實(shí)現(xiàn)方式大致有四種:
#### 1)方式1
**讓bean實(shí)現(xiàn)Serializable 接口,然后將集合強(qiáng)轉(zhuǎn)成Srializable 類型,然后通過intent 的 putExtra( key , value ) 傳遞**;代碼如下:

* 創(chuàng)建User類,并讓其實(shí)現(xiàn)Serializable 接口
  代碼省略,具體可以查看上面的代碼

* IntentUseActivity.java 數(shù)據(jù)發(fā)送方

public class IntentUseActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_intent_use);

    Button btn_forResult = (Button) findViewById(R.id.btn_forResult);
    btn_forResult.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(IntentUseActivity.this, TestActviity.class);
            //                List<User> list = new ArrayList<User>();
            ArrayList<User> list = new ArrayList<User>();
            for (int i = 0; i < 10; i++) {
                User user = new User();
                user.setName("張三" + i);
                user.setSex("女");
                user.setAge(27);
                user.setIsAdult(true);
                list.add(user);
            }
            intent.putExtra("SerialUserList", list);    //如果集合是ArrayList 不需要強(qiáng)轉(zhuǎn)
            //                intent.putExtra("SerialUserList", (Serializable) list);   //如果集合是List 需要強(qiáng)轉(zhuǎn)
            startActivity(intent);
        }
    });
}

}

* TestActviity.java 數(shù)據(jù)接收方

public class TestActviity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_testactivtiy);

    //獲取Serializable 對(duì)象,并強(qiáng)轉(zhuǎn)成 list集合
    Serializable serializable = getIntent().getSerializableExtra("SerialUserList");
    
    //        List<User> userList= (List<User>) serializable;
    ArrayList<User> userList = (ArrayList<User>) serializable;  //接收的時(shí)候強(qiáng)轉(zhuǎn)
    for (User user : userList) {
        Log.e("上一個(gè)界面?zhèn)鬟f過來的數(shù)據(jù):", user.getName() + user.getAge() + user.getSex() + user.isAdult);
    }
}

}

> 這里有一點(diǎn)需要注意的,如果定義的集合類型是ArrayList 在傳遞的時(shí)候不需要強(qiáng)轉(zhuǎn),如果List 則需要強(qiáng)轉(zhuǎn)。




####2) 方式2 
**讓bean 實(shí)現(xiàn)Parcelable 接口,然后使用 intent 的putParcelableArrayList(key,value) 方法**

* 創(chuàng)建User類,讓其實(shí)現(xiàn)Parcelable接口
  代碼省略,具體可以參考前面的代碼。
  >讓bean類實(shí)現(xiàn)Parcelable 接口時(shí),有一個(gè)小技巧,可以先把bean類及其成員變量以及set get 方法定義好,然后再去實(shí)現(xiàn)Parcelable 接口,會(huì)提示你實(shí)現(xiàn)方法,你就直接按下快捷鍵實(shí)現(xiàn)相應(yīng)的方法就好,然后你就會(huì)發(fā)現(xiàn), writeToPaecel ( ) 以及 CREATOR常量都已經(jīng)幫你生成好了,同時(shí)生成了一個(gè)bean類的有參構(gòu)造,參數(shù)是Parcel  , 那么你現(xiàn)在唯一需要做的就是在給出一個(gè)空參構(gòu)造 。

* IntentUseActivity.java 數(shù)據(jù)發(fā)送方

public class IntentUseActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_intent_use);

    Button btn_forResult = (Button) findViewById(R.id.btn_forResult);
    btn_forResult.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(IntentUseActivity.this, TestActviity.class);
            List<User> list = new ArrayList<User>();
            //                ArrayList<User> list = new ArrayList<User>();
            for (int i = 0; i < 10; i++) {
                User user = new User();
                user.setName("張三" + i);
                user.setSex("女");
                user.setAge(27);
                user.setIsAdult(true);
                list.add(user);
            }
            //                intent.putParcelableArrayListExtra("ParcelableList", list);  //如果集合是ArrayList 不需要強(qiáng)轉(zhuǎn)
            intent.putParcelableArrayListExtra("ParcelableList", (ArrayList<User>) list); //如果集合是List需要強(qiáng)轉(zhuǎn)成ArrayList
            startActivity(intent);
        }
    });
}

}


* TestActviity.java 數(shù)據(jù)接收方

public class TestActviity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_testactivtiy);

    //        ArrayList<User> userList=getIntent().getParcelableArrayListExtra("ParcelableList");
    List<User> userList = getIntent().getParcelableArrayListExtra("ParcelableList"); //上面的代碼也可以

    for (User user : userList) {
        Log.e("上一個(gè)界面?zhèn)鬟f過來的數(shù)據(jù):", user.getName() + user.getAge() + user.getSex() + user.isAdult);
    }
}

}


####3) 方式3 
**讓bean類實(shí)現(xiàn)Serializable接口,然后將集合強(qiáng)轉(zhuǎn)成Srializable 類型,然后再調(diào)用Bundle 對(duì)象的 putSerializable(key ,value) ,最后在用intent 的putExtras(bundle) ,或者 putExtra(key,bundle) 將數(shù)據(jù)傳遞出去。**(這種方式歸根結(jié)底也是用了A 方式,只不過多封裝了一層,效率不高,不如直接用A實(shí)在。) 
>  這種方法就不列出完整代碼了,只給出關(guān)鍵部分:
* 發(fā)送方

Bundle bundle = new Bundle();

bundle.putSerializable("userList",(Serializable)list);

intent.putExtras(bundle);
startActivity(intent);

* 接收方

List<User> userList = (List<User>) getIntent( ).getSerializableExtra
("userList");



>> **注意:**
**使用intent傳遞實(shí)現(xiàn)了Serializable 或者Parcelable接口 的bean對(duì)象或bean對(duì)象集合的時(shí)候,bean內(nèi)部包含的成員變量必須全部是基本數(shù)據(jù)類型?。。?**

>>**如果有非基本數(shù)據(jù)類型會(huì)報(bào)如下錯(cuò)誤:Parcelable encountered IOException writing serializable object android**


》》》》》》等會(huì)兒,晚上下班接著寫
####4) 方式4
**如果,你感覺用 Intent 對(duì)象傳來傳去比較麻煩,還要去解析,那么 最最直接的方法就是,自定義Application,并在自定義的Application中創(chuàng)建一個(gè)全局的集合變量,這樣各個(gè)組件就都可以訪問、獲取、設(shè)置這個(gè)集合的值了。**



###(5) 傳遞 String 、Integer、CharSequence 類型數(shù)據(jù)的集合
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容