萬盛學電腦網

 萬盛學電腦網 >> 腳本專題 >> javascript >> startActivityForResult 用在於多個Activity之間傳值時一些需要注意的用法

startActivityForResult 用在於多個Activity之間傳值時一些需要注意的用法

   requestCode請求碼,即調用startActivityForResult() 傳遞過去的值resultCode結果碼,結果碼用於標識返回數據來自哪個新Activity

  舉個例子可能會更明白:

  1.在Activity中得到新打開Activity 關閉後返回的數據

  package com.google_acmer.activitys;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;public class MainActivity extends Activity { private final static String TAG="MainActivity"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button btnOpen=(Button)this.findViewById(R.id.btnOpen); btnOpen.setOnClickListener(new View.OnClickListener(){ public void onClick(View v) { //得到新打開Activity關閉後返回的數據 //第二個參數為請求碼,可以根據業務需求自己編號 startActivityForResult(new Intent(MainActivity.this, OtherActivity.class), 1); } }); } /** * 為了得到傳回的數據,必須在前面的Activity中(指MainActivity類)重寫onActivityResult方法 * * requestCode 請求碼,即調用startActivityForResult()傳遞過去的值 * resultCode 結果碼,結果碼用於標識返回數據來自哪個新Activity */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { String result = data.getExtras().getString("result");//得到新Activity 關閉後返回的數據 Log.i(TAG, result); }}

  2.新Activity關閉前需要向前面的Activity返回數據

  package com.google_acmer.activitys;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.Button;public class OtherActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.other); Button btnClose=(Button)findViewById(R.id.btnClose); btnClose.setOnClickListener(new View.OnClickListener(){ public void onClick(View v) { //數據是使用Intent返回 Intent intent = new Intent(); //把返回數據存入Intent intent.putExtra("result", "My name is gu"); //設置返回數據 OtherActivity.this.setResult(RESULT_OK, intent); //關閉Activity OtherActivity.this.finish(); } }); }}//setResult()方法的第一個參數值可以根據業務需要自己定義

  請求碼的作用

  使用 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) { .... button1.setOnClickListener(new View.OnClickListener(){ public void onClick(View v) { startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 1); } }); button2.setOnClickListener(new View.OnClickListener(){ public void onClick(View v) { startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 2); } }); @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch(requestCode){ case 1: //來自按鈕1的請求,作相應業務處理 case 2: //來自按鈕2的請求,作相應業務處理 } }}

  結果碼的作用

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

  public class ResultActivity extends Activity { ..... ResultActivity.this.setResult(1, intent); ResultActivity.this.finish();}public class NewActivity extends Activity { ...... NewActivity.this.setResult(2, intent); NewActivity.this.finish();}public class MainActivity extends Activity { // 在該Activity會打開ResultActivity和NewActivity @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch(resultCode){ case 1: // ResultActivity的返回數據 case 2: // NewActivity的返回數據 } }}

  關於調用startActivityForResult後onActivityResult立刻響應,而返回當前頁時onActivityResult不響應的問題

  我被這個問題糾結了好久,第二次栽在了launchMode上了……最後終於通過實驗發現了這個問題的所在!

  共有兩種情況:

  第一種:當resultCode==0時,Activity的launchMode必須設置為”singleTask”或者singleInstance,否則就會出錯。這是因為從Task的角度看,Android認為不同Task之間的Activity是不能傳遞數據的,所以不能使用NEW_TASK標識,但還是要調用forResult方法。

  第二種:當resultCode!=0時,Activity的launchMode必須為standard(刪除launchMode屬性默認為standard模式),原因同上。

copyright © 萬盛學電腦網 all rights reserved