本文譯自:http://developer.android.com/training/basics/intents/sending.html
Android的重要特性之一就是基於要執行的特定的“action”把使用者帶入另外一個應用程式。例如,如果你的應用程式有一個要在地圖上顯示的地址,你不必在你的應用程式建立一個用於顯示地圖的Activity。相反,你可以使用Intent對象給地圖應用程式的View建立一個請求,然後Android系統就會啟動對應的應用程式,病在地圖上顯示你給出的地址。
在講解第一課時---建立你的第一個應用程式,在你自己的應用程式中的Activity間,你必須使用Intent對象來導航。通常要使用明確的Intent對象,其中明確的定義了你想要啟動的組件的類名。但是,當你要實行不同的應用程式中的一個操作時,你必須要使用一個隱含的Intent對象。
本節課會告訴你如何給一個特殊的操作建立一個隱含的Intent對象,以及如何使用這個對象來啟動另外一個應用程式中Activity來執行對應的操作。
建立一個隱含的Intent對象
隱含的Intent對象不會聲明要啟動的組件的類名,相反它會聲明一個要執行的操作。這個操作指定了你想要做的事情,如瀏覽、編輯、發送或擷取某些事情。Intent對象還經常會包括跟操作相關聯的資料,如你想要瀏覽的網址,或要發送Mail的電子郵件地址。根據你建立的Intent,關聯的資料可以是一個Uri,這是最常見的幾種資料類型之一,或者也完全可以不需要資料。
如果你的資料時一個Uri,那麼就可以簡單的使用Intent()構造器來定義操作和資料。
例如,下例代碼建立了一個Intent對象,它會使用Uri中指定的電話號碼來啟動撥打電話程式:
Uri number=Uri.parse("tel:5551234");
Intent callIntent = new Intent(Intent.ACTION_DIAL, number);
當你的應用程式通過調用startActivity()方法來調用這個Intent對象時,電話應用程式會使用給定的號碼來發起一個呼叫。
以下是另外兩個Intent的操作和Uri資料對:
1. 瀏覽一個地圖
// Map point based on address Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California"); // Or map point based on latitude/longitude // Uri location = Uri.parse("geo:37.422219,-122.08364?z=14"); // z param is zoom level Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);
2. 瀏覽一個網頁
Uri webpage =Uri.parse("http://www.android.com"); Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);
隱含的Intent對象還會要求提供不同資料類型的額外資料,如字串。你可以使用各種putExtra()方法來添加一個或多個額外資料。
預設情況下,系統會通過一個Intent對象上的Uri所包含的資料來判斷對應的MIME類型,如果你沒有在Intent對象中包含Uri,那麼通常你應該使用setType()方法來指定跟Intent對象關聯的資料的類型。設定MIME類型會進一步指定由那種類型的Activity來接收Intent對象。
以下是一些給指定的操作添加額外資料的Intent對象:
1. 發送帶有附件的email:
Intent emailIntent =newIntent(Intent.ACTION_SEND); // The intent does not have a URI, so declare the "text/plain" MIME type emailIntent.setType(HTTP.PLAIN_TEXT_TYPE); emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"jon@example.com"}); // recipients emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Email subject"); emailIntent.putExtra(Intent.EXTRA_TEXT, "Email message text"); emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://path/to/email/attachment")); // You can also attach multiple items by passing an ArrayList of Uris
2. 建立一個日曆事件:
Intent calendarIntent=newIntent(Intent.ACTION_INSERT,Events.CONTENT_URI);
Calendar beginTime = Calendar.getInstance().set(2012, 0, 19, 7, 30);
Calendar endTime = Calendar.getInstance().set(2012, 0, 19, 10, 30);
calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis());
calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis());
calendarIntent.putExtra(Events.TITLE, "Ninja class");
calendarIntent.putExtra(Events.EVENT_LOCATION, "Secret dojo");
注意:這個針對日曆事件的Intent對象只在API level 14以上的版本才會被支援。
注意:重要的是,你要儘可能的具體的瞭解你要定義的Intent對象。例如,如果你想要使用ACTION_VIEW類型Intent來顯示一張圖片,那麼你應該指定一個image/*的MIME類型。這樣會防止能夠瀏覽其他類型資料應用程式被這個Intent對象所觸發。