Activity的跳转与传值

Activity的跳转与传值
2010-05-30 22:56:32
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://android.blog.51cto.com/268543/323982
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.     } 
 
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.     } 
    这里要注意的是,在处理Back键事件后return true则表示本事件不再传递给其他函数处理,可理解为由当前函数全权负责处理,所以在return前finish当前Activity,保持原来的行为表现,当然我们可以设置为隐藏当前Activity等其他行为。
 

Activity传送数据

    在上面的代码中,我们可以看到使用Bundle来存储数据,并将其putExtras到Intent里面。Bundle使用“名字-值”来存储数据。那么,从原来的Activity A传送数据到新的Activity B, Activity B如何获取传送过来的Intent参数时呢?最近写了这样的一个例子:
 
In Activity A:
  1. // 在某个按钮响应事件里 
  2. Intent intent = new Intent(this, TextInputActivity.class); 
  3. intent.putExtra("Text", mText); 
  4. intent.putExtra("TextColor", mTextColor); 
  5. intent.putExtra("TextSize", mTextSize); 
  6. intent.putExtra("TextBold", mTextBold); 
  7.  
  8. startActivityForResult(intent, REQUEST_TEXT); 
In Activity B:
  1. // in onCreate(Bundle savedInstanceState) 
  2. Bundle extras = getIntent().getExtras(); 
  3. mText = extras.getString("Text"); 
  4. mTextColor = extras.getInt("TextColor"); 
  5. mTextSize = extras.getFloat("TextSize"); 
  6. mTextBold = extras.getBoolean("TextBold"); 
 
 

本文出自 “学习Android” 博客,请务必保留此出处http://android.blog.51cto.com/268543/323982

阅读更多
个人分类: android
上一篇Android: R cannot be resolved to a variable
下一篇打开多个Activity,返回到第一个Activity的问题
想对作者说点什么? 我来说一句

Android Intent跳转和回传值

2016年04月06日 1.1MB 下载

fragment与activity

2015年01月28日 26KB 下载

Activity之间的跳转项目案例实现

2013年05月16日 1.19MB 下载

StartActivityForResult小例子

2016年01月08日 2.3MB 下载

Activity跳转传值

2013年12月22日 288KB 下载

Android游戏BeatPlane源码

2015年12月21日 3.22MB 下载

没有更多推荐了,返回首页

关闭
关闭