既然Intent可以传值 为什么还搞个Bundle来个传值出来
举个例子先 我现在要从A界面 跳转到B界面或者C界面 这样的话 我就需要写2个Intent 如果你还要涉及的传值的话 你的Intent就要写两遍添加值的方法 那么 如果我用1个Bundle 直接把值先存里边 然后再存到Intent中 不就更简洁.
简单的说,Intent传值只有一次有效。Bundle的传值是一直在内存中直到断电的。
接下来用两个例子说明。
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(); } }