天天看點

Android學習之使用startActivityForResult()和onActivityResult()進行跳轉并傳回資料

大家都知道Activity間的跳轉可以使用startActivity(),然後傳入1個Intent,指定元件即可,然後跳轉的那個Activity要傳回時,需要再使用一次startActivity(),如果需要傳遞資料回來,肯定需要用Intent,但是不斷地調用startActivity(),每次跳轉系統都會在task中生成一個新的Activity執行個體,并且放于棧結構的頂部,當我按下後退鍵時,才能看到原來的Activity執行個體。當然這是在standard啟動模式,不管有沒有已存在的執行個體,都生成新的執行個體。

是以要使用finish()來傳回,但是如果我不使用startActivity()也就是不能傳入Intent時,我們該怎麼把Intent也就是資料傳遞回去呢?

假設有2個Activity A和B,這時候Activity A就該使用startActivityForResult()了,使用startActivityForResult()的同時必須使用onActivityResult(),顧名思義,就是得到Activity B傳回的結果,也就是通過Intent攜帶的資料,Intent簡直是往返兩地的高鐵啊,呵呵。

怎麼使用startActivityForResult()呢,startActivityForResult()需要一個int類型的請求碼,這個請求碼會随着Activity A的跳轉而帶過去,而跳轉過去的Activity B  finish()的時候,我們需要使用setResult()來設定一個結果碼,這個結果碼必須為RESULT_OK,因為Activity A的onActivityResult()會依次判斷結果碼和請求碼,隻有都符合的時候,OK,我們可以從onActivityResult()的參數Intent data中擷取資料啦,這個data就是Activity B中的Intent。

下面是Demo,先看Activity A:

/**
 * 主界面
 *
 * @author yuzhentao
 */
public class MainActivity extends Activity {

    private static final int REQUEST_CODE = 1;

    private Context context;
    private TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context = this;
        initView();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK) {//如果結果碼等于RESULT_OK
            if (requestCode == REQUEST_CODE) {
                String result = data.getExtras().getString("result");
                tv.setText(result);
            }
        }
    }

    private void initView() {
        tv = (TextView) findViewById(R.id.textview_activity_main);
        findViewById(R.id.button_activity_main).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivityForResult(new Intent(context, DemoActivity.class), REQUEST_CODE);//帶上requestCode跳轉
            }
        });
    }

}      

下面是Activity B:

/**
 * DemoActivity
 *
 * @author yuzhentao
 */
public class DemoActivity extends Activity {

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

    private void initView() {
        findViewById(R.id.button_activity_demo).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.putExtra("result", "你好,我是傳回的資料");
                setResult(RESULT_OK, intent);//設定resultCode
                finish();
            }
        });
    }

}      

最後是效果圖:

Android學習之使用startActivityForResult()和onActivityResult()進行跳轉并傳回資料
Android學習之使用startActivityForResult()和onActivityResult()進行跳轉并傳回資料
Android學習之使用startActivityForResult()和onActivityResult()進行跳轉并傳回資料

Demo位址:http://download.csdn.net/detail/qq_23940659/9467070