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. if (requestCode == SEND_SMS_REQUEST ) {
14. if (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.setResult(RESULT_CANCELED, 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. if (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. this.finish();
23. return true;
24. }else {
25. return super.onKeyDown(keyCode, event);
26. }
27. }
这里要注意的是,在处理Back 键事件后return true 则表示本事件不再传递给其他函数处理,可理解为由当前函数全权负责处理,所以在return 前finish 当前Activity ,保持原来的行为 表现,当然我们可以设置为隐藏当前Activity 等其他行为。