详解 Intent Bundle 传值 区别

简介: Intent 和Bundle有什么样的区别? 既然Intent可以传值 为什么还搞个Bundle来个传值出来 举个例子先  我现在要从A界面   跳转到B界面或者C界面    这样的话 我就需要写2个Intent  如果你还要涉及的传值的话 你的Intent就要写两遍添加值的方法 那么 如果我用1个Bundle  直接把值先存里边 然后再存到Intent中 不就更简洁. 简单的说,Intent传值只有一次有效。
Intent 和Bundle有什么样的区别?

既然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();
    }
   
}



目录
相关文章
|
11月前
|
Android开发
关于Android中intent传值问题
关于Android中intent传值问题
71 0
|
10月前
|
存储 Android开发
Android 中使用intent.putExtra实现Activity之间的参数传递
Android 中使用intent.putExtra实现Activity之间的参数传递
72 0
|
Android开发
显式Intent和隐式Intent解析
Android中的Intent分为两种类型: * `显式 Intent`:按名称(完全限定类名)指定要启动的组件。 通常,您会在自己的应用中使用显式 Intent 来启动组件,这是因为您知道要启动的 Activity 或服务的类名。例如,启动新 Activity 以响应用户操作,或者启动服务以在后台下载文件。 * `隐式 Intent` :不会指定特定的组件,而是声明要执行的常规操作,从而允许其他应用中的组件来处理它。 例如,如需在地图上向用户显示位置,则可以使用隐式 Intent,请求另一具有此功能的应用在地图上显示指定的位置。
|
XML Java Android开发
Intent的用法(1)
Intent的中文意思是目的,主要是用来在不同的Activity中跳转
Intent的用法(1)
|
XML Java Android开发

热门文章

最新文章