使用Intent實現活動間的跳轉和數據傳遞

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();
	}






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章