Intent是Android程序中各組件之間進行交互的一種重要方式,它不僅可以指明當前組件想喲啊執行的動作,還可以在不同組件之間傳遞數據。Intent一般可被用於啓動活動、啓動服務、以及發送廣播等。
Intent用法大致分爲兩種,顯式Intent和隱式Intent。
一、顯式Intent
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);
}
});
首先要構造出一個Intent對象,傳入FirstActivity.this作爲上下文,傳入SecondActivity.class作爲目標活動,我們的意圖就是在FirstActivity活動的基礎上啓動SecondActivity目標活動,然後通過startActivity()方法來執行這個Intent。
二、隱式Intent
隱式Intent並不指明我們想要啓動哪一個活動,而是指定了一系列更爲抽象的action和category等信息,然後交由系統分析找出可以響應這個隱式Intent的活動。
首先在AndroidManifest中的<activity>標籤中配置<intent-filter>的內容,
<span style="white-space:pre"> </span><activity
android:name="com.gomez.menutest.SecondActivity">
<intent-filter>
<action android:name="com.gomez.menutest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
在<action>標籤中指明com.gomez.menutest.ACTION_START這個action,而<category>標籤則包含了一些附加信息,更精確地指明瞭當前的活動能夠響應的Intent中還可能帶有的category。只有<action>和<category>中的內容同時能夠匹配上Intent中的action和category時,這個活動才能響應該Intent。修改按鈕點擊事件:
@Override
public void onClick(View v) {
intent = new Intent(FirstActivity.this, SecondActivity.class);
// startActivity(intent);
Intent intent = new Intent("com.gomez.menutest.ACTION_START");
startActivity(intent);
}
在這裏沒有指定category,因爲android.intent.category.DEFAULT是一種默認的category,在調用startActivity()方法的時候會自動將這個category添加到Intent中。每個Intent只能指定一action,但可以指定多個category。現在我們再來增加一個category
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
// Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
// startActivity(intent);
Intent intent = new Intent("com.gomez.menutest.ACTION_START");
intent.addCategory("com.gomez.menutest.MY_CATEGORY");
startActivity(intent);
}
接下來修改AndroidManifest中<activity>標籤
<span style="white-space:pre"> </span><activity
android:name="com.gomez.menutest.SecondActivity">
<intent-filter>
<action android:name="com.gomez.menutest.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.gomez.menutest.MY_CATEGORY" />
</intent-filter>
</activity>
這樣SecondActivity就可以響應這個category。
三、活動間的數據傳遞
1、向下一個活動傳遞數據
在啓動活動是傳遞數據的私立很簡單,Intent提供一系列putExtra()方法重載,可以把我們想要傳遞的數據暫存在Intent中,啓動另一個活動後,只需把這些數據再從Intent中區取出即可。比如傳遞一個字符串,可以這樣編寫代碼:
<pre name="code" class="java">public void onClick(View v) {
String data = "Hello secondActivity";
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("extra_data", data);
startActivity(intent);
}
注意這裏的putExtra()方法接收兩個參數,第一個參數是鍵,第二參數是要傳遞的數據。
然後我們在SecondActivity中將傳遞的數據取出,並打印出來
public class SecondActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
Log.d("SecondActivity", data);
}
}
2、返回數據給上一個活動
修改點擊事件代碼:
public void onClick(View v) {
String data = "Hello secondActivity";
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivityForResult(intent, 1);
}
這裏我們使用startActivityForResult()方法來啓動SecondActivity,第一個參數是Intent,第二個參數是請求碼,用於在之後的回調中判斷數據的來源,這裏我們傳入1就可以了。
接下來我們在SecondActivity中註冊按鈕事件
button2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("data_return", "Hello FirstActivity");
setResult(RESULT_OK, intent);
finish();
}
});
注意這裏的調用的setResult()方法,是專門用於向上一個活動返回數據的,第一個參數用於向上一個返回處理的結果,一般是隻使用RESULT_OK或RESULT_CANCELED這兩個值,第二個參數是帶有數據的Intent對象。然後調用finish(),銷燬當前活動,當返回上一個活動時,會回調onActivityResult()方法,因此我們要在FirstActivity中重寫這個方法來得到返回的數據。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case 1:
if(resultCode == RESULT_OK){
String returnData = data.getStringExtra("data_return");
Log.d("FirstActivity", returnData);
}
break;
default:
break;
}
}
第一個參數是在啓動活動時的請求碼,第二個參數是返回數據時傳入的處理結果,第三個參數是攜帶返回數據的Intent。
如果我們通過back鍵返回上一個活動我們可以通過重寫onBackPressed()方法來解決,代碼如下:
@Override
public void onBackPressed() {
Intent intent = new Intent();
intent.putExtra("data_return", "Hello FirstActivity");
setResult(RESULT_OK, intent);
finish();
}