標籤:android intent activity startactivity startactivityforresu
Intent是一種訊息傳遞機制,它可以在應用程式內使用,也可以在應用程式間使用,主要用途分為:
1.使用類名顯示的啟動一個特定的Activity或Service
2.啟動Activity或Service來執行一個動作的Intent,通常需要使用特定的資料,或者對特定的資料執行動作
3.廣播某個事件已經發生
Intent最常見的一個用法是顯示的(通過指定要裝載的類)或隱式的(通過請求對一條資料執行某個動作)啟動新的activity,在後一種情況下,動作不一定由調用應用程式中的Activty執行。
Intent也可以在系統範圍內發送廣播訊息。應用程式可以註冊一個Broadcast Receiver來監聽相應這些廣播的Intent。Android就是通過廣播Intent來公布系統事件,比如網路連接狀態或者電池電量的改變。
1.使用Intent來啟動activity
Intent最常見的用途就是繫結應用程式組件,並在應用程式之間進行通訊。
1.1 顯示啟動新Activity
要顯示的選擇要啟動的Activity類,可以建立一個新的Intent來指定當前Activity的上下文以及要啟動的Activity的類,然後把這個Intent傳遞給startActivity,代碼如下:
<span style="white-space:pre"></span>Intent intent = new Intent(getApplicationContext(), Activity1.class);startActivity(intent);
在調用startActivity之後,新的Activity將會被建立 啟動和恢複運行,他會移動到Activity棧的頂部。
調用新的Activity的finish或按下裝置的返回按鈕將關閉該Activity,並把它從棧中移除。
1.2 隱式的Intent和運行時遲綁定
隱式的Intent提供了一種機制,可以讓匿名的應用程式組件相應請求動作,也就是說,可以要求系統啟動一個可執行給定動作的Activity,而不必知道需要那啟動哪個應用程式或Activity。
假如在我們的應用程式中,可以讓使用者點擊某個按鈕實現撥打到電話的操作,那麼可以使用隱式的Intent來完成,代碼如下:
<span style="font-size:14px;"><span style="white-space:pre"></span>intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:010-123456"));startActivity(intent);</span> Android會解析這個Intent,並啟動一個新的Activity,該Activity會提供對這個電話號碼進行撥號的動作。
當構建一個隱式的Intent時,需要指定一個要執行的動作,另外,也可以提供執行那個動作需要的uri資料,還可以通過向Intent添加extra來向目標Intent發送額外的資料。
Extra是一種想Intent附加基本類型值得機制。
如果多個Activity都能執行指定的動作,則會向使用者呈現各種選項。Intent Resolution解析過程是通過分析註冊的Broadcast Receiver來完成的。
許多本地應用程式都提供了能夠對特定資料執行動作的Activity,第三方應用程式可以通過註冊來支援新的動作,也可以提供本地動作的替換提供器。
1.3 確定Intent能否解析
在自己的應用程式中,利用第三方應用程式的Activity和Service是十分方便的,但是我們無法保證使用者裝置上安裝了特定的某個應用程式或者裝置上有能夠處理我們的請求的應用程式。因此,在調用startActivity之前,確定調用是否可以解析為一個Activity是一種很好的選擇。
通過調用Intent的resolveActivity方法,並向該方法傳入包管理器,可以對包管理器進行查詢,確定是否有Activity能夠啟動以響應該Intent。代碼如下:
<span style="font-size:14px;"><span style="white-space:pre"></span>Intent intent = new Intent(getApplicationContext(), Activity1.class);PackageManager pm = getPackageManager();ComponentName cn = intent.resolveActivity(pm);if (cn == null) {</span>
<span style="font-size:14px;">//沒有activity可以處理這個動作,檢查google play是否可以Uri marketUri = Uri.parse("market://search?q=pname:com.happy.demo");Intent marketIntent = new Intent(Intent.ACTION_VIEW).setData(marketUri);if(marketIntent.resolveActivity(pm)!=null){startActivity(marketIntent);}else{Log.i(TAG, "sorry,無法解析");}<span style="white-space:pre"></span>} else {startActivity(intent);}</span>如果沒有找到相應的Activity,可以選擇禁用相關的功能,也可以引導使用者去應用市場中找合適的應用程式。
1.4 從Activity返回結果
通過startActivity啟動的Activity獨立於父Activity,並且在關閉時不會提供任何反饋。
當需要反饋時,可以啟動一個Activity作為另一個Activity的子Activity,用它向父Activity傳遞結果,子Activity只是以一種不同的方式啟動的Activity。
當子Activity結束時,它會出發調用Activity內的事件處理常式onActivityResult。對於一個Activity為另一個Activity提供資料輸入的情況,子Activity特別適用。
startActivityForResult的工作形式和startActivity相似,但是有一個重要的區別,除了傳入顯示或隱式Intent外,還需要傳入一個請求碼,這個值將在後面使用者唯一標識返回了結果的子Activity。代碼如下:
<span style="white-space:pre"></span>private static final String TAG = "MainActivity";private static final int SHOW_ACTIVITY_01 = 1;@Override<span style="white-space:pre"></span>protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Intent intent = new Intent(getApplicationContext(), Activity1.class);startActivityForResult(intent, SHOW_ACTIVITY_01);
<span style="white-space:pre"></span>}
當準備好返回子Activity時,可以在調用finish以前調用setResult,以便向調用Activty返回一個結果。
setResult方法有兩個參數:結果碼和表示為Intent的結果資料本身。
結果碼是運行子Activity的結果----通常是Activity.RESULT_OK或者Activity.RESULT_CANCELED。當這兩個值不能滿足我們需求時,可以使用自己的響應碼,setResult支援任意的整數值。
作為結果返回的Intent通常包含某段內容(比如選擇的連絡人 電話號碼)的URI和使用者返回附加資訊的一組extra。代碼如下:
<span style="font-size:14px;"><span style="white-space:pre"></span>long selectedItemId = listView.getSelectedItemId();Uri selectedHorse = Uri.parse("content://horses/"+selectedItemId);intent = new Intent(Intent.ACTION_PICK, selectedHorse);</span>
<span style="font-size:14px;">setResult(Activity.RESULT_OK, intent);finish();</span>
如果使用者通過按下硬體返回鍵關閉Activity,或者在調用finish之前沒有調用setResult,那麼結果碼將被設定為Result_CANCELED,結果Intent將被設定為null。
當子Activity關閉的時候,將會觸發其調用Activity的onActivityResult事件處理常式,可以對其進行重寫來處理返回結果,其方法接收三個參數,分別為:
請求碼:在啟動正在返回的Activity時使用的請求碼
結果碼:子Activity設定的結果碼,用於說明其結果。
資料:Intent用來封裝所有返回的資料,可能包含代表指定內容的uri,也可能是子Activity設定的Intent內以extra形式返回的資料。
代碼如下:
<span style="font-size:14px;"><span style="white-space:pre"></span>@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);switch (requestCode) {case SHOW_ACTIVITY_01:if (requestCode == Activity.RESULT_OK) {//TODO}break;case SHOW_ACTIVITY_02:if (requestCode == Activity.RESULT_OK) {//TODO}break;}}</span> 好了,Intent第一篇就簡單寫到這了,目測沒什麼難的,都是基礎性的東西。
Android中Intent詳解(一)