顯式Intent的使用
- Intent的 Intent(Context packageContext,Class<?> cls),這個函數中,第一個參數Context要求提供一個啓動活動的上下文,第二個參數Class則是指定想要啓動的目標活動。Activity類中提供一個startActivity()方法,專門用來啓動活動
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
}
});
隱式Intent的使用
- 隱式Intent不明確指出要啓動哪個活動,而是指定了一系列更爲抽象的action和category等信息,由系統分析Intent並幫我們找出合適的活動去啓動。
- 只有<action>和<category>中的內容同時能匹配上Intent中指定的action和category時,這個活動才能響應這個Intent。
- 一個Intent中只能指定一個action,而可以指定多個category。可以調用Intent中的addCategory()來添加一個category,添加之後,需要在<intent-filter>標籤中添加一個category的聲明,否則會導致程序的崩潰。
向下一個活動傳遞數據
- Intent中提供了一系列putExtra()方法的重載,可以把我們想要傳遞數據暫存在Intent中,啓動了另一個活動之後,只需把這些數據再從Intent中拿出來即可。
public void onClcik(View v){
String data = "Hello SecondActivity";
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("extra_data",data);
startActivity(intent);
}
putExtra()方法中接收兩個參數,第一個是鍵,用於後面從Intent中取值,第二個纔是真正要傳遞的數據。
- 如上代碼所示,將字符串data存儲在Intent中後,要在SecondActivity中用到時,方法如下所示:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_layout);
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
Log.d("SecondActivity",data);
}
首先通過getIntent()方法獲取用於啓動SecondActivity的Intent,然後調用getStringExtra()方法,傳入相應鍵值。
返回數據給上一個活動
- Activity中還有一個startActivityForResult()方法,期望在活動銷燬時能返回一個結果給上一個活動。這個方法有兩個參數,第一個仍是intent,第二個是請求碼,用於在之後的回調中判斷數據的來源。
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivityForResult(intent,1);
}
}
這裏使用startActivityForResult()方法來啓動SecondActivity,請求碼只要是一個唯一值即可。在SecondActivity中給按鈕註冊點擊事件,並在點擊事件添加返回數據的邏輯
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_layout);
Button button2 = (Button) findViewById(R.id.button_2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("data_return", "Hello FirstActivity");
setResult(RESULT_OK, intent);
finish();
}
});
}
這裏構建的Intent僅用於傳輸數據。把數據存儲在Intent中後,調用了setResult()方法,專門用於向上一個活動返回數據的。此方法接收兩個參數,第一個用於向上一個活動返回處理結果,一般只使用RESULT_OK或RESULT_CANCELED,第二個則是把帶有數據的Intent傳遞回去,然後用finish()方法銷燬當前活動。
- 由於我們是使用startActivityForResult()方法來啓動SecondActivity的,活動被銷燬後會回調回上一個活動的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");
Log.d("FirstActivity", returnedData);
}
break;
default:
}
}
onActivityResult()方法中有三個參數,第一個requestCode,即在啓動活動時傳入的請求碼(判斷數據來源的依據)。第二個是resultCode,即在我們返回數據時傳入的處理結果(判讀數據處理是否成功)。第三個是data,即攜帶數據返回的Intent。