首页 > 技术文章 > startActivityForResult详解

baorantHome 2017-06-11 12:22 原文

在启动另外一个Activity的时候,有两种方法,一种是直接使用startActivity,另外一种就是使用startActivityForResult。本文主要通过一个Demo来学习一下第二种。

startActivityForResult的主要作用就是它可以回传数据,假设我们有两个页面,首先进入第一个页面,里面有一个按钮,用于进入下一个页面,当进入下一个页面时,进行设置操作,并在其finish()动作或者back动作后,将设置的值回传给第一个页面,从而第一个页面来显示所得到的值。这个有一点像回调方法,就是在第二个页面finish()动作或者back动作后,会回调第一个页面的onActivityResult()方法,所以我们可以重写一下这个方法。直接看代码吧:

第一个页面代码:

 1  
 2  3   
 4 import android.app.Activity;  
 5 import android.content.Intent;  
 6 import android.os.Bundle;  
 7 import android.view.View;  
 8 import android.view.View.OnClickListener;  
 9 import android.widget.Button;  
10 import android.widget.TextView;  
11   
12 public class TestStartActivityForResultActivity extends Activity implements  
13         OnClickListener {  
14     private TextView mText01;  
15     private TextView mText02;  
16     private Button button01;  
17     private Button button02;  
18     private Intent mIntent;  
19     private int requestCode;  
20   
21     /** Called when the activity is first created. */  
22     @Override  
23     public void onCreate(Bundle savedInstanceState) {  
24         super.onCreate(savedInstanceState);  
25         setContentView(R.layout.main);  
26         mText01 = (TextView) findViewById(R.id.mText01);  
27         mText02 = (TextView) findViewById(R.id.mText02);  
28         button01 = (Button) findViewById(R.id.mButton01);  
29         button02 = (Button) findViewById(R.id.mButton02);  
30         button01.setOnClickListener(this);  
31         button02.setOnClickListener(this);  
32         mText01.setText("01");  
33         mText02.setText("02");  
34   
35         mIntent = new Intent();  
36         mIntent.setClass(TestStartActivityForResultActivity.this,  
37                 Activity02.class);  
38     }  
39   
40     @Override  
41     public void onClick(View v) {  
42         switch (v.getId()) {  
43         case R.id.mButton01:  
44             // 请求码的值随便设置,但必须>=0  
45             requestCode = 0;  
46             startActivityForResult(mIntent, requestCode);  
47             break;  
48         case R.id.mButton02:  
49             requestCode = 2;  
50             startActivityForResult(mIntent, requestCode);  
51             break;  
52         default:  
53             break;  
54         }  
55     }  
56   
57     // 回调方法,从第二个页面回来的时候会执行这个方法  
58     @Override  
59     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
60         String change01 = data.getStringExtra("change01");  
61         String change02 = data.getStringExtra("change02");  
62         // 根据上面发送过去的请求吗来区别  
63         switch (requestCode) {  
64         case 0:  
65             mText01.setText(change01);  
66             break;  
67         case 2:  
68             mText02.setText(change02);  
69             break;  
70         default:  
71             break;  
72         }  
73     }  
74 }  

 

 第一个页面布局文件:

 1 <?xml version="1.0" encoding="utf-8"?>  
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
 3     android:orientation="vertical"  
 4     android:layout_width="fill_parent"  
 5     android:layout_height="fill_parent"  
 6     >  
 7 <TextView    
 8     android:id="@+id/mText01"  
 9     android:layout_width="fill_parent"   
10     android:layout_height="wrap_content"   
11     />  
12 <TextView    
13     android:id="@+id/mText02"  
14     android:layout_width="fill_parent"   
15     android:layout_height="wrap_content"   
16     />  
17 <Button   
18     android:id="@+id/mButton01"  
19     android:layout_width="fill_parent"   
20     android:layout_height="wrap_content"  
21     android:text="改变第一行文本的值"  
22     />  
23 <Button   
24     android:id="@+id/mButton02"  
25     android:layout_width="fill_parent"   
26     android:layout_height="wrap_content"  
27     android:text="改变第二行文本的值"  
28     />  
29 </LinearLayout>  

 

第二个页面代码:

 1 import android.app.Activity;  
 2 import android.content.Intent;  
 3 import android.os.Bundle;  
 4   
 5 public class Activity02 extends Activity {  
 6     private int resultCode = 0;  
 7   
 8     @Override  
 9     protected void onCreate(Bundle savedInstanceState) {  
10         super.onCreate(savedInstanceState);  
11         setContentView(R.layout.activity02);  
12         Intent mIntent = new Intent();  
13         mIntent.putExtra("change01", "1000");  
14         mIntent.putExtra("change02", "2000");  
15         // 设置结果,并进行传送  
16         this.setResult(resultCode, mIntent);  
17         // this.finish();  
18     }  
19   
20 }  

 

 

第二个页面布局文件:

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:orientation="vertical"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    >  
<TextView    
    android:layout_width="fill_parent"   
    android:layout_height="wrap_content"   
    android:text="文本的值已经改变"  
    />  
</LinearLayout> 

 

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>  
<manifest xmlns:android="http://schemas.android.com/apk/res/android"  
      package="org.sunchao"  
      android:versionCode="1"  
      android:versionName="1.0">  
    <uses-sdk android:minSdkVersion="8" />  
  
    <application android:icon="@drawable/icon" android:label="@string/app_name">  
        <activity android:name=".TestStartActivityForResultActivity"  
                  android:label="@string/app_name">  
            <intent-filter>  
                <action android:name="android.intent.action.MAIN" />  
                <category android:name="android.intent.category.LAUNCHER" />  
            </intent-filter>  
        </activity>  
        <activity android:name=".Activity02" />  
  
    </application>  
</manifest>  

 

推荐阅读