在啓動活動時傳遞數據的思路其實很簡單,Intent中提供了一系列putExtra()方法的重載,我們把需要傳遞的數據暫存在Intent中,啓動了另一個活動之後,只需要把這些數據提取出來就可以了。
活動間傳遞數據分爲兩種情況,向下傳遞以及返回上一個活動傳遞
1.向下一個活動傳遞數據
在AActivity中有一個字符串,現在要把這個字符串傳遞到BActivity中:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String data = "Hello";
Intent intent = new Intent(AActivity.this,BActivity.class);
intent.putExtra("extar_data",data);
startActivity(intent);
}
});
這裏我們用的是顯示Intent的方式來啓動BActivity,並通過putExtra()方法傳遞了一個字符串。
putExtra()方法接收兩個參數,第一個參數是 鍵 ,用於後面從Intent中取值, 第二個參數是傳遞的數據。
接下來在BActivity中把數據取出:
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
這裏我們傳遞的是字符串,所以使用getStringExtra()方法來獲取數據;如果是整型數據,則使用getIntExtra()方法;如果是布爾型數據,則使用getBooleanExtra()方法.....
2.返回數據給上一個活動
startActivityForResult()方法也是用於啓動活動的,不同的是,這個方法期望在活動銷燬的時候能夠返回一個結果給上一個活動。
startActivityForResult()方法接收兩個參數,第一個參數還是Intent,第二個參數是請求碼,用於在之後的回調中判斷數據的來源。
修改一下之前的代碼:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(AActivity.this,BActivity.class);
startActivityForResult(intent,1);
}
});
這裏我們使用startActivityForResult()方法來啓動BActivity,請求碼只要是一個唯一值就可以了,這裏傳入了1。
接下來添加BActicity中返回數據的邏輯:
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("data_return","Hello AActivity");
setResult(RESULT_OK,intent);
finish();
}
});
我們還是構建了一個Intent,只不過這個Intent僅僅是用於傳遞數據,沒有指定任何的”意圖“。
緊接着把要傳遞的數據存放在Intent中,然後調用了setResult()方法。
這個方法是專門用於向上一個活動返回數據的。
setResult()方法接收兩個參數,第一個參數用於向上一個活動返回處理結果,一般使用RESULT_OK或RESULT_CANCELED這兩個值,第二個參數則把帶有數據的Intent傳遞回去,然後調用finish()方法來銷燬當前活動。
在BActivity被銷燬之後會回調上一個活動的onActivityResult()方法。
因此我們需要在AActivity中重寫onActivityResult()方法來得到數據:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
switch (requestCode){
case 1:
if (resultCode == RESULT_OK){
String returnedData = data.getStringExtra("data_return");
}
break;
default:
}
}
onActivityResult()方法有三個參數,第一個參數requestCode,啓動活動時傳入的請求碼。第二個參數resultCode,返回數據時傳入的處理結果。第三個參數data,攜帶着返回數據的Intent.
如果是通過按下Back鍵返回,那麼在onBackPressed()方法寫邏輯就好了。