/**
* 測試android中直接用Intent傳值與Bundle傳值的區別
*
* 歡迎大家提問
* by garretly
* mail garretly@gmail.com
*/
前一陣子逛EOE 看有有人提問 Intent 和Bundle有什麼樣的區別
既然Intent可以傳值 為什麼還搞個Bundle來個傳值出來
舉個例子先 我現在要從A介面 跳轉到B介面或者C介面
這樣的話 我就需要寫2個Intent 如果你還要涉及的傳值的話 你的Intent就要寫兩遍添加值的方法 那麼 如果我用1個Bundle 直接把值先存裡邊 然後再存到Intent中 不就更簡潔嗎?
public class A extends Activity {
private Button btn;
private TextView tv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.a);
btn = (Button) findViewById(R.id.btn1);
tv =(TextView) findViewById(R.id.tv1);
tv.setText("Activity----A");
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
next();
}
});
}
private void next(){
Intent i = new Intent();
i.setClass(this, B.class);
i.putExtra("int", 1000);
i.putExtra("String", "測試");
i.putExtra("char", 'c');
startActivity(i);
finish();
}
}
public class B extends Activity {
private Button btn;
private TextView tv;
int temp1;
String temp2;
char temp3;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.b);
btn = (Button) findViewById(R.id.btn2);
tv = (TextView) findViewById(R.id.tv2);
getI(getIntent());
/**
* 說一下 這裡為什麼寫View.OnClickListener()
* 因為在調用OnClickListener()會有多種OnClickListener
* ()對象,因此我在這裡不通過導包來使用OnClickListener
* ()對象,而是通過在對象前添加View來告知編譯器我調用的是哪個OnClickListener()對象
*/
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
next();
}
});
}
// 擷取從A中傳來的資料
private void getI(Intent i) {
// int temp1 = i.getIntExtra("int", 0);
// String temp2 = i.getStringExtra("String");
// char temp3 = i.getCharExtra("char", 'a');
temp1 = i.getIntExtra("int", 0);
temp2 = i.getStringExtra("String");
temp3 = i.getCharExtra("char", 'a');
System.out.println(temp1);
System.out.println(temp2);
System.out.println(temp3);
tv.setText("Activity----B" +"/n"+
"int=======" + temp1 +"/n"+
"String=======" + temp2+"/n"
+ "char========" + temp3);
}
/**
* 現在要將從A中傳過來的值 在傳到C中去,那麼 就要將temp1 temp2 temp3 改為全域變數 並且要填入一些B中的屬性
*/
private void next() {
Intent i = new Intent();
i.setClass(this, C.class);
i.putExtra("int", temp1);
i.putExtra("String", temp2);
i.putExtra("char", temp3);
// 同時我現在還要將B中的一些屬性傳給C
i.putExtra("boolean", true);
startActivity(i);
finish();
}
}
public class C extends Activity {
private Button btn;
private TextView tv;
int temp1;
String temp2;
char temp3;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.c);
btn = (Button) findViewById(R.id.btn3);
tv =(TextView) findViewById(R.id.tv3);
//getIntent() 是擷取從哪裡啟動這個activity的Intent對象
getI(getIntent());
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
next();
}
});
}
//擷取從C中傳來的資料
private void getI(Intent i){
// int temp1 = i.getIntExtra("int", 0);
// String temp2 = i.getStringExtra("String");
// char temp3 = i.getCharExtra("char", 'a');
temp1 = i.getIntExtra("int", 0);
temp2 = i.getStringExtra("String");
temp3 = i.getCharExtra("char", 'a');
boolean temp4 = i.getBooleanExtra("boolean", false);
tv.setText("Activity----C"+"/n"+
"int======="+temp1+"/n"+
"String======="+temp2+"/n"+
"char========"+temp3+"/n"+
"boolean========"+temp4
);
}
private void next(){
Intent i = new Intent();
i.setClass(this, com.garretly.b.A.class);
startActivity(i);
Toast.makeText(getApplicationContext(), "測試Bundle", Toast.LENGTH_LONG).show();
finish();
}
}
另外一個例子 如果我現在有 Activity A ,B ,C;
現在我要把值通過A經過B傳給C
你怎麼傳 如果用Intent的話 A-B先寫一遍 再在B中都取出來 然後在把值塞到Intent中 再跳到C 累嗎?
如果我在A中用了 Bundle 的話 我把Bundle傳給B 在B中再轉傳到C C就可以直接去了
這樣的話 還有一個好處 就是在B中 還可以給Bundle對象添加新的 key - value 同樣可以在C中取出來
public class A extends Activity {
/**
* 在這個類中我們來使用bundle進行傳值
*/
private Button btn;
private TextView tv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.a);
btn = (Button) findViewById(R.id.btn1);
tv =(TextView) findViewById(R.id.tv1);
tv.setText("Activity----A");
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
next();
}
});
}
private void next(){
Intent i = new Intent();
Bundle b = new Bundle();
i.setClass(this, B.class);
b.putInt("int", 1000);
b.putString("String", "測試");
b.putChar("char", 'c');
i.putExtras(b);
startActivity(i);
finish();
}
}
public class B extends Activity {
private Button btn;
private TextView tv;
Bundle b = new Bundle();
int temp1;
String temp2;
char temp3;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.b);
btn = (Button) findViewById(R.id.btn2);
tv = (TextView) findViewById(R.id.tv2);
getI(getIntent());
/**
* 說一下 這裡為什麼寫View.OnClickListener()
* 因為在調用OnClickListener()會有多種OnClickListener
* ()對象,因此我在這裡不通過導包來使用OnClickListener
* ()對象,而是通過在對象前添加View來告知編譯器我調用的是哪個OnClickListener()對象
*/
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
next();
}
});
}
// 直接用bundle擷取從A中傳來的資料
private void getI(Intent i) {
b = i.getExtras();
temp1 = b.getInt("int", 0);
temp2 = b.getString("String");
temp3 = b.getChar("char", 'a');
tv.setText("Activity----B" +"/n"+ "int=======" + temp1 +"/n"+ "String======="
+ temp2 +"/n"+ "char========" + temp3);
}
/**
* 現在要將從A中傳過來的值 在傳到C中去,那麼 就要將temp1 temp2 temp3 改為全域變數
* 並且要填入一些B中的屬性
*
* 我們這次直接用bundle來做
*/
private void next() {
Intent i = new Intent();
i.setClass(this, C.class);
b.putBoolean("boolean", true);
i.putExtras(b);
//這裡在做一個測試 就是將從A過來的B放在Intent中來傳遞
i.putExtra("Bundle", b);
startActivity(i);
finish();
}
}
public class C extends Activity {
private Button btn;
private TextView tv;
int temp1;
String temp2;
char temp3;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.c);
btn = (Button) findViewById(R.id.btn3);
tv =(TextView) findViewById(R.id.tv3);
//getIntent() 是擷取從哪裡啟動這個activity的Intent對象
getI(getIntent());
btn.setText("結束測試");
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
next();
}
});
}
//擷取從C中傳來的資料
private void getI(Intent i){
Bundle b = new Bundle();
b = i.getExtras();
Bundle b2 = i.getBundleExtra("Bundle");
temp1 = b.getInt("int", 0);
temp2 = b.getString("String");
temp3 = b.getChar("char", 'a');
boolean temp4 = b.getBoolean("boolean", false);
tv.setText("Activity----C"+"/n"+
"int======="+temp1+"/n"+
"String======="+temp2+"/n"+
"char========"+temp3+"/n"+
"boolean========"+temp4+"/n"+
"b2=============="+b2.toString()//b2 中的資料就不再取出來了 大家可以明白什麼意思 但是擷取到的是他的大小 這個還得看底層代碼
);
}
private void next(){
Toast.makeText(this, "測試結束", Toast.LENGTH_LONG).show();
finish();
}
}
整合項目
http://download.csdn.net/source/3152096