Activity 跳转与传值,主要是通过Intent 类来连接多个Activity

 

Intent 是Android 一个很重要的类。Intent 直译是“ 意图” ,什么是意图呢?比如你想从这个Activity 跳转到另外一个Activity ,这就是一个意图。Intent 类在Android 系统中的作用很大,在此不详细说了,后面有文章介绍!

 

Activity 跳转,无返回结果

   这是最简单的Activity 跳转方式。从一个Activity 启动另一个Activity ,直接startActivity(new Intent( 当前Activity.this, 下一Activity.class))

1.            ((Button) findViewById(R.id.Notepadv1)).setOnClickListener( new OnClickListener() {  
2.                public void onClick(View v) {  
3.                    startActivity(new Intent (MyAndroidAppActivity.this, Notepadv1.class) );  
4.                }  
5.            });

 

Activity 跳转,返回数据/

   需要返回数据或结果的,则使用startActivityForResult (Intent intent, int requestCode)

,requestCode 的值是自定义的,用于识别跳转的目标Activity

   跳转的目标Activity 所要做的就是返回数据/ 结果,setResult(int resultCode) 只返回结果不带数据,或者setResult(int resultCode, Intent data)

   而接收返回的数据/ 结果的处理函数是onActivityResult(int requestCode, int resultCode, Intent data) ,这里的requestCode 就是startActivityForResult 的requestCode ,resultCode 就是setResult 里面的resultCode ,返回的数据在data

 

MyAndroidAppActivity :

1.            static final int SEND_SMS_REQUEST = 0; 
2.            static final int CALL_REQUEST = 1; 
3.             
4.            ((Button) findViewById(R.id.sms)).setOnClickListener( new OnClickListener() { 
5.                public void onClick(View v) { 
6.                    Intent intent = new Intent(MyAndroidAppActivity.this, SendSMSActivity.class); 
7.            startActivityForResult(intent, SEND_SMS_REQUEST);
8.                } 
9.            }); 
10.         
11.        @Override 
12.        protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
13.        requestCode == SEND_SMS_REQUEST
14.        resultCode == RESULT_OK
15.                    Toast.makeText(this, "Send SMS RESULT_OK", Toast.LENGTH_SHORT).show(); 
16.                }else if (resultCode == RESULT_CANCELED) { 
17.                    Bundle bundle = data.getExtras(); 
18.                    String phoneno = bundle.getString("phoneNO");  
19.                    Toast.makeText(this, "Send SMS RESULT_CANCELED "+phoneno, Toast.LENGTH_SHORT).show(); 
20.                } 
21.            }else if (requestCode == CALL_REQUEST) { 
22.                if (resultCode == RESULT_CANCELED) { 
23.                    Toast.makeText(this, "Call RESULT_CANCELED", Toast.LENGTH_SHORT).show(); 
24.                } 
25.            } 
26.        }

 

SendSMSActivity :

1.            ((Button) findViewById(R.id.send)).setOnClickListener( new Button.OnClickListener() { 
2.                public void onClick(View v) { 
3.            SendSMSActivity. this.setResult(RESULT_OK); 
4.            SendSMSActivity. this.finish(); 
5.                } 
6.            }):

 

** 注意,在setResult 后,要调用finish() 销毁当前的Activity ,否则无法返回到原来的Activity ,就无法执行原来Activity 的onActivityResult 函数,看到当前的Activity

 

RESULT_OK 和RESULT_CANCELED

 

   另外在运行过程中,发现按Back 键后,是可以返回RESULT_CANCELED 的,看了SDK doc RESULT_CANCELED 时并返回数据,那么需要截获Back 键的事件处理,把原来返回RESULT_CANCELED 的核心逻辑copy

 

1.            ((Button) findViewById(R.id.cancel)).setOnClickListener( new Button.OnClickListener() { 
2.                public void onClick(View v) { 
3.                    //  实例化 Bundle ,设置需要传递的参数 
4.                    Bundle bundle = new Bundle(); 
5.                    bundle.putString("phoneNO", "020-123"); 
6.             
7.            SendSMSActivity. this.getIntent().putExtras(bundle)
8.                    SendSMSActivity.this.finish(); 
9.                } 
10.        }); 
11.         
12.        @Override 
13.        public boolean onKeyDown(int keyCode, KeyEvent event) { 
14.            //  是否触发按键为back 键    
15.        keyCode == KeyEvent.KEYCODE_BACK
16.                 
17.                //  实例化 Bundle ,设置需要传递的参数 
18.                Bundle bundle = new Bundle(); 
19.                bundle.putString("phoneNO", "020-123"); 
20.                 
21.                setResult(RESULT_CANCELED, this.getIntent().putExtras(bundle)); 
22.        .finish();
23.                return true; 
24.            }else { 
25.                return super.onKeyDown(keyCode, event); 
26.            } 
27.        }

     这里要注意的是,在处理Back 键事件后return true 则表示本事件不再传递给其他函数处理,可理解为由当前函数全权负责处理,所以在return 前finish 当前Activity ,保持原来的行为 表现,当然我们可以设置为隐藏当前Activity