天天看點

startActivityForResult和onActivityResult的學習

在Activity中有個onActivityResult方法,如果Activity A使用startActivityForResult方法跳轉到其他Activity,當再次傳回到Activity A時就會觸發onActivityResult方法。

先寫下使用總結:

1.建立一個REQUST_CODE

2.在Activity A通過startActivityForResult啟動Activity B

3.在Activity B中使用intent攜帶資料,setResult設定資料結果,在finish方法執行後傳回結果資料

4.在Activity A中使用onActivityResult方法,根據不同的request_code,從Intent中擷取資料做不同處理。

來說下onActivityResult中的參數:

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

requestCode:請求碼,在startActivityForResult中會發送一個Int類型的請求碼,傳回到Activity A的時候就會擷取當初發送出去的請求碼。(多個startActivityForResult的時候用requestCode以判斷并執行不同的操作。)

resultCode:結果碼,通常情況下都會傳回RESULT_OK(-1),其他兩種沒有試出來。

data:intent用于傳遞傳回的資料。

自己寫了個demo來測試onActivityResult方法:

MainActivity:

public class MainActivity extends AppCompatActivity {

    private Button btnEnter01,btnEnter02;
    private TextView tvResult,tvResult02;

    private final static int REQUEST_CODE = 1000;//設定請求碼
    private final static int REQUEST_CODE_02 = 1001;//設定請求碼

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnEnter01 = (Button) findViewById(R.id.btnEnter);
        btnEnter02 = (Button) findViewById(R.id.btnEnter02);
        tvResult = (TextView) findViewById(R.id.tvResult);
        tvResult02 = (TextView) findViewById(R.id.tvResult02);

        btnEnter01.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivityForResult(new Intent(MainActivity.this,FirstActivity.class),REQUEST_CODE);//發送請求碼并進入第二個Activity
            }
        });
        btnEnter02.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivityForResult(new Intent(MainActivity.this,SecondActivity.class),REQUEST_CODE_02);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.e("uding", "in onActivityResult");
        Log.e("uding","requestCode = " + requestCode + " resultCode = " + resultCode);
         /*這裡實測了RESULT_FIRST_USER和RESULT_CANCELED,結果發現傳回的都是RESULT_OK*/
        if (resultCode == RESULT_OK){//當第二個Activity中結果碼為RESULT_OK
            if (requestCode == REQUEST_CODE) {//這裡通過startActivityForResult方法中的REQUEST_CODE來判斷(如果有多個)
                String result = data.getExtras().getString("RESULT_STRING");
                tvResult.setText(result);
            }
            if (requestCode == REQUEST_CODE_02){
                String result = data.getExtras().getString("RESULT_STRING");
                tvResult02.setText(result);
            }
        }
    }
}      

FirstActivity:

public class FirstActivity extends AppCompatActivity {

    private Button btnBack;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first);
        btnBack = (Button) findViewById(R.id.btnBack);
        btnBack.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent();
                i.putExtra("RESULT_STRING","FirstActivity接收成功");
                setResult(Activity.RESULT_OK, i);
                finish();
            }
        });
    }
}      

SecondActivity和FirstActivity的代碼一樣的,就不貼出來了。

運作結果:從MainActivity分别跳轉到FirstActivity和SecondActivity,在傳回到MainActivity後,兩個TextView的内容都改變了。