Android startActivity ForResultとsetResultの違い

3780 ワード

Android startActivity ForResultとsetResultの違い
startActivity ForResultとstartActivityの違いは、次の点です.
1、startActivity( )
ターゲットページにジャンプするだけで、現在のページに戻るにはstartActivity()をもう一度使用する必要があります.
2、startActivityForResult( )
このタスクは、プログラムがこのコードに実行されると、T 1 Activityから次のText 2 Activityにジャンプし、このText 2 Activityがfinish()メソッドを呼び出すと、プログラムは自動的にT 1 Activityにジャンプし、前のT 1 ActivityのonActivity()メソッドを呼び出すことができます.
関連関数:

startActivityForResult(Intent intent, Int requestCode)
setResut(int resultCode, Intent intent)
onActivityResult(int requestCode, int resultCode, Intent intent)


簡単な例:
1.ジャンプの場合はstartActivity(intent)ではなくstartActivity ForResult(intent,0)

Intent intent=new Intent();
intent.setClass(A.this, B.class);
Bundle bundle=new Bundle();
String str1="aaaaaa";
bundle.putString("str1", str1);
intent.putExtras(bundle);
startActivityForResult(intent, 0);//    startActivityForResult    ,   0     ,       ,    >=0

2.onActivity Resultメソッドを書き換え、Bエコーのデータを受信する.

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (resultCode) { //resultCode      ,  B     RESULT_OK
  case RESULT_OK:
  Bundle b=data.getExtras(); //data B    Intent
  String str=b.getString("str1");//str      
  break;
default:
  break;
  }
}

3.Bでデータを再送する場合はsetResultメソッドを使用し、その後finishメソッドを呼び出す.

setResult(RESULT_OK, intent); //intent A     Bundle intent,           Bundle
finish();//       finish()  

Android activityのsetResult()がいつ呼び出されるか(ポイントも難点)
startActivity ForResultで起きたActivityにsetResultを設定すると、結果はすぐにparentのActivityに戻らず、現在のActivityだけがfinishされ、結果はparentのonActivity Resultに送られて処理されます!
activityが起動したactivityにデータを返す場合は、setResult()メソッドを呼び出すことができます.では、setResult()メソッドを呼び出してデータを返すのはいつですか?ソースコードを見ればわかります.

public final void setResult(int resultCode, Intent data) {
    synchronized (this) {
      mResultCode = resultCode;
      mResultData = data;
    }
  }

  public void finish() {
    if (mParent == null) {
      int resultCode;
      Intent resultData;
      synchronized (this) {
        resultCode = mResultCode;
        resultData = mResultData;
      }
      if (Config.LOGV) Log.v(TAG, "Finishing self: token=" + mToken);
      try {
        if (ActivityManagerNative.getDefault()
          .finishActivity(mToken, resultCode, resultData)) {
          mFinished = true;
        }
      } catch (RemoteException e) {
        // Empty
      }
    } else {
      mParent.finishFromChild(this);
    }
  }


このコードからactivityがresultを返すのはfinishによって返される場合,すなわちsetResult()メソッドを呼び出すにはfinish()の前にしなければならないことがわかる.
では、setResult()を次の方法で呼び出すと、成功に戻らない可能性があります.onPause()、onStop()、onDestroy()
これらのメソッド呼び出しはfinishの前にあるとは限らないので、もちろんonCreate()でsetResultを呼び出すのはfinishの前にあるに違いない.
BACKキーを押してActivityから退いた場合、BACKを押すとandroidはActivityのfinish()メソッドを自動的に呼び出し、resultCodeをRESULT_に設定します.CANCELEEDは、何のデータも返さない.
解決策は、ActivityでBACKを押すイベントをキャプチャし、キャプチャしてからsetResult、それから自分でfinishを呼び出せば済む…BACKをそのまま自分で飲み込む

@Override
  public void onBackPressed() {
    Log.i(TAG, "onBackPressed");
    setResult(Const.LIVE_OK);
    super.onBackPressed();
  }

もちろんonCreate()でsetResultを呼び出すこともできますが、onBackPressed()を書き換える方法はないと思います.
以上がAndroid startActivity ForResultとsetResultの違いです.質問があれば、伝言を残したり、当駅のコミュニティで交流したりしてください.読んでくれてありがとう.助けてほしいです.当駅のサポートに感謝します.