Android 關於Activity啟動中的requestCode 和 resultCode 的傳遞和用法(Activity 三 )


《》我們知道在通過一個Activity啟動另一個Activity的時候,可以使用startActivityForResult(Intent intent , int requestCode)方法,也就是說帶有返回值的啟動方法

使用這種方法的步驟如下:

1、當前的Activity重寫onActivityResult(int requestCode , int resultCode , Intent) ,當被啟動的Activity返回結果的時候,該方法將會被觸發,其中的requestCode 和resultCode都是根據業務自行設置的

2、當前的Activity通過調用starActivityForResult(Intent intent , int requestCode)啟動新的Activity

3、被啟動的新的Activity需要調用setResult(int resultCode , Intent intent )方法設置將要返回個舊Activity的結果,(將數據封裝在Intent中 )

關於帶有返回結果的Activity的啟動方法參見之前的“Activity的配置、啟動和關閉”一文,下面來集中精力來講一下requestCode 和 resultCode 的使用方法:

 

requestCode請求碼的作用


使用startActivityForResult(Intent intent, int requestCode)方法打開新的Activity,我們需要為startActivityForResult()方法傳入一個請求碼(第二個參數)。請求碼的值是根據業務需要由自已設定,用於標識請求來源。例如:一個Activity有兩個按鈕,點擊這兩個按鈕都會打開同一個Activity,不管是那個按鈕打開新Activity,當這個新Activity關閉后,系統都會調用前面Activity的onActivityResult(int requestCode, int resultCode, Intent data)方法。在onActivityResult()方法如果需要知道新Activity是由那個按鈕打開的,並且要做出相應的業務處理,這時可以這樣做:

@Override  public void onCreate(Bundle savedInstanceState) {

2.        ....

3.        button1.setOnClickListener(new View.OnClickListener(){

4.            public void onClick(View v) {

5.                startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 1);
7.           }
9.        });

10.        button2.setOnClickListener(new View.OnClickListener(){

11.            public void onClick(View v) {

12.                 startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 2);
14.            }
16.        }); 
19.       @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {

20.               switch(requestCode){

21.                   case 1:

22.                   //來自按鈕1的請求,作相應業務處理

23.                   case 2:

24.                   //來自按鈕2的請求,作相應業務處理

25.                }

26.          }

27.}

 

 

resultCode結果碼的作用


在一個Activity中,可能會使用startActivityForResult()方法打開多個不同的Activity處理不同的業務,當這些新Activity關閉后,系統都會調用前面Activity的onActivityResult(int requestCode, int resultCode, Intent data)方法。為了知道返回的數據來自於哪個新Activity,在onActivityResult()方法中可以這樣做(ResultActivity和NewActivity為要打開的新Activity):

public class ResultActivity extends Activity {

2.       .....

3.       ResultActivity.this.setResult(1, intent);

4.       ResultActivity.this.finish();

5.}

6.public class NewActivity extends Activity {

7.       ......

8.        NewActivity.this.setResult(2, intent);

9.        NewActivity.this.finish();

10.}

11.public class MainActivity extends Activity { // 在該Activity會打開ResultActivity和NewActivity

12.       @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {

13.               switch(resultCode){

14.                   case 1:

15.                   // ResultActivity的返回數據

16.                   case 2:

17.                    // NewActivity的返回數據

18.                }

19.          }

20.} 

 

 

下面就根據上面的分析寫出一個完整的代碼


整體上的思路是這樣的:

1、總過用四個Activity,分別是:ActivityResult(主Activity)、SecondActivity 、 ThirdActivity 、FourthActivity

2、ActivityResult是主Activity,它的布局文件中安排有一個文本TextView,三個按鈕,分別是 button1 , button2 ,button3

3、button1 和 button2 被點擊時,都會起動SecondeActivity,但是button1發出的requestCode是 1  , 而button2發出的requestCode是 2 ,

4、button3被點擊時,將會同時起動ThirdActivity和FourthActivity , 但是在ThirdActivity的setResult(int resultCode , Intent intent)的resultCode是  5 

     而FourthActivity的setResult(int resultCode , Intent intent)的resultCode是  6

5、當我們點擊不同的button的時候都會最終回調  ActivityResult  的  onActivityResult(int requestCode, int resultCode, Intent data)方法,在這個方法中將會通過對請求

    碼和結果碼的判別 而 更新TextView中顯示的內容

 

ActivityResult.java文件

public class ActivityResult extends Activity {
    
    Button button1;
    Button button2;
    Button button3 ;
    TextView textView ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_result);
        
        button1 = (Button) findViewById(R.id.button1);
        button2 = (Button) findViewById(R.id.button2);
        button3 = (Button) findViewById(R.id.button3) ;
        textView = (TextView) findViewById(R.id.textView);
        
        button1.setOnClickListener(new OnClickListener(){
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(ActivityResult.this ,SecondActivity.class ) ;
                startActivityForResult(intent , 1) ;
            }
        });
        
        button2.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(ActivityResult.this , SecondActivity.class) ;
                startActivityForResult(intent , 2) ;
            }
        });
        
        button3.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v) {
                Intent intent1 = new Intent(ActivityResult.this , ThirdActivity.class) ;
                Intent intent2 = new Intent(ActivityResult.this , FourthActivity.class);
                startActivityForResult(intent1 , 3) ;
                startActivityForResult(intent2 , 4) ;
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch(requestCode){
        case 1 :
            textView.setText("SecondActivity是由  按鈕one  啟動的");
            break ;
        case 2 :
            textView.setText("SecondActivity是由 按鈕two 啟動的") ;
            break ;
        }
        
        switch(resultCode){
        case 5 :
            textView.setText("ThirdActivity返回了結果");
            break ;
        case 6 :
            textView.setText("FourthActivity返回了結果") ;
            break ;
        }
        
        super.onActivityResult(requestCode, resultCode, data);
    }
}

 

SecondeActivity.java文件

public class SecondActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SecondActivity.this.setResult(0,new Intent());
        SecondActivity.this.finish();
    }
}

 

ThirdActivity.java 文件

public class ThirdActivity extends Activity{ @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); ThirdActivity.this.setResult(5,new Intent()); ThirdActivity.this.finish(); } }

 

FourthActivity.java 文件

public class FourthActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FourthActivity.this.setResult(6,new Intent());
        FourthActivity.this.finish();
    }
}

 上面的程序中用到了多個Activity,一定記得在Manifest.xml文件中對他們進行配置


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM