Android-Intent與Bundle在傳值上的區別
阿新 • • 發佈:2019-01-22
Intent與Bundle在activity之間傳值的區別
Intent的putExtra()方法有:
public Intent putExtra(String name, boolean value); public Intent putExtra(String name, byte value); public Intent putExtra(String name, char value); public Intent putExtra(String name, short value); public Intent putExtra(String name, int value); public Intent putExtra(String name, long value); public Intent putExtra(String name, float value); public Intent putExtra(String name, double value); public Intent putExtra(String name, String value); public Intent putExtra(String name, CharSequence value); public Intent putExtra(String name, Parcelable value); public Intent putExtra(String name, Parcelable[] value); ...</span>
檢視putExtra()方法中的原始碼,方法裡面還是使用了Bundle物件,mExtras變數是在Intent類中定義的;Intent內部還是用bundle來實現資料傳遞的,只是在外面封裝了一層。
public Intent putExtra(String name, String value) { if (mExtras == null) { mExtras = new Bundle(); } mExtras.putString(name, value); return this; }</span>
Bundle類的作用
Bundle類用作攜帶資料,它類似於Map,用於存放key-value名值對形式的值。相對於Map,它提供了各種常用型別的putXxx()/getXxx()方法,如:putString()/getString()和putInt()/getInt(),putXxx()用於往Bundle物件放入資料,getXxx()方法用於從Bundle物件裡獲取資料。
Bundle的內部實際上是使用了HashMap<String, Object>型別的變數來存放putXxx()方法放入的值。簡單地說,Bundle就是一個封裝好的包,專門用於匯入Intent傳值的包。
Intent在傳值時沒有Bundle的情況:public void putBoolean(String key, boolean value); public void putByte(String key, byte value); public void putChar(String key, char value); ...
傳送資料的Activity
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText) findViewById(R.id.edit);
button = (Button) findViewById(R.id.button1);
String txt = editText.getText().toString();
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String string = editText.getText().toString();
Intent intent = new Intent(MainActivity.this, main.class);
intent.putExtra("name", string);
startActivity(intent);
}
});
}
接收資料的Activity
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textView = (TextView) findViewById(R.id.txt2);
Intent intent = getIntent();
String string = intent.getStringExtra("name");
textView.setText(string);
}
使用Bundle 進行傳值:
傳送資料的Activity
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText) findViewById(R.id.edit);
button = (Button) findViewById(R.id.button1);
String txt = editText.getText().toString();
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String string = editText.getText().toString();
Intent intent = new Intent(MainActivity.this, main.class);
Bundle bundle = new Bundle();
bundle.putString("name", string);
intent.putExtras(bundle);
startActivity(intent);
}
});
}
接收方的Activity
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textView = (TextView) findViewById(R.id.txt2);
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
String string = bundle.getString("name");
textView.setText(string);
}
Bundle在存取資料是比較靈活的,而Intent在存取資料的種類很少且沒有指定資料型別;
想對資料進行比較靈活的操作如批量操作的話就用bundle;
Bundle是可以對物件進行操作的,而Intent不可以。Bundle相對於Intent比較偏下層,比Intent介面更多,更靈活,但Bundle仍需要藉助Intent才能在Activity之間傳遞。
概括一下,Intent旨在資料傳遞,bundle旨在存取資料,當然intent也提供一部分資料的存取,但比起bundle就顯得很不靈活。