zoukankan      html  css  js  c++  java
  • Android中Intent与Bundle 在传值时有什么不同

     /**

     * 测试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

  • 相关阅读:
    国税开发子系统----纳税服务子系统问题
    Hibernate中的一对一多映射和一对一映射的创建
    hibernate 创建一对一唯一外键映射的问题
    疑问,TESt中注入sessionFactory失败
    AJAX方式进行验证码的判断(JS方式)
    过滤器和拦截器的使用
    SSH框架的整合
    编码问题
    微服务架构对比
    docker安装mysql8.0连接问题,sqlyog报2058或者Navicat 1257
  • 原文地址:https://www.cnblogs.com/firecode/p/2614520.html
Copyright © 2011-2022 走看看