zoukankan      html  css  js  c++  java
  • 详解 Intent Bundle 传值 区别

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



  • 相关阅读:
    mysql数据库题目【杭州多测师】【杭州多测师_王sir】
    python题目:维度为(M,N)求矩阵的转置【杭州多测师】【杭州多测师_王sir】
    python题目【杭州多测师】【杭州多测师_王sir】
    购物车测试点【杭州多测师】【杭州多测师_王sir】
    史上最全软件测试工程师常见的面试题总结【杭州多测师】【面试题】【杭州多测师_王sir】
    查询"001"课程比"002"课程成绩高的所有学生的学号【杭州多测师】【杭州多测师_王sir】
    mysql数据库查询当天,最近7天,最近1个月数据【杭州多测师】【杭州多测师_王sir】
    python题目:判断一个IP地址是否合法【杭州多测师】【杭州多测师_王sir】
    sql floor()函数
    mysql左连右连
  • 原文地址:https://www.cnblogs.com/xiaowangba/p/6314541.html
Copyright © 2011-2022 走看看