Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android App之間通過Intent交互

Android App之間通過Intent交互

編輯:關於Android編程

Android 最重要的功能之一是應用能夠基於它要執行的“操作”向另一個應用發送用戶。 例如,如果您的應用有您要在地圖上顯示的公司地址,您無需在顯示地圖的應用中構建 Activity。 而是可以創建使用 Intent 查看地址的請求。Android 系統之後啟動可以在地圖上顯示該地址的應用。

用 Intent 在自己應用中的 Activity 之間進行導航。 您通常使用顯式 Intent 執行此操作,該 Intent 定義您希望啟動的組件的確切類名稱。 但是,當您希望另一應用執行操作時,比如“查看地圖”,您必須使用隱含 Intent。

展示如何針對特定操作創建隱含 Intent,以及如何使用該 Intent 啟動在另一個應用中執行操作的 Activity。

構建隱含 Intent

隱含 Intent 不聲明要啟動的組件的類名稱,而是聲明要執行的操作。 該操作指定您要執行的操作,比如查看、編輯、發送或 獲取 某項。 Intent 通常還包含與操作關聯的數據,比如您要查看的地址或您要發送的電子郵件消息。根據要創建的 Intent,數據可能是 Uri、多種其他數據類型之一,或 Intent 可能根本就不需要數據。

如果您的數據是 Uri,您可以使用一個簡單的 Intent() 構造函數來定義操作和數據。

例如,此處顯示如何使用指定電話號碼的 Uri 數據創建發起電話呼叫的 Intent:

Uri number = Uri.parse(“tel:5551234”);
Intent callIntent = new Intent(Intent.ACTION_DIAL, number);


當您的應用通過調用 startActivity() 調用此 Intent 時,“電話”應用會發起向指定電話號碼的呼叫。

這裡有一些其他 Intent 及其操作和 Uri 數據對:

查看地圖:

// 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);

查看網頁:

Uri webpage = Uri.parse(“http://www.android.com“);
Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);


其他類型的隱含 Intent 需要提供不同數據類型(比如,字符串)的“額外”數據。 您可以使用各種 putExtra() 方法添加一條或多條 extra 數據。

默認情況下,系統基於所包含的 Uri 數據確定 Intent 需要的相應 MIME 類型。如果您未在 Intent 中包含 Uri,您通常應使用 setType() 指定與 Intent 關聯的數據的類型。 設置 MIME 類型可進一步指定哪些類型的 Activity 應接收 Intent。

此處有更多添加額外數據以指定所需操作的 Intent:

發送帶附件的電子郵件:

Intent emailIntent = new Intent(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[] {"[email protected]"}); // 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

創建日歷事件:

Intent calendarIntent = new Intent(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");

注:

只有 API 級別 14 或更高級別支持此日歷事件 Intent。

注:

盡可能具體地定義您的 Intent 非常重要。例如,如果您想要使用 ACTION_VIEW Intent 顯示圖像,您應指定 MIME 類型 image/*。這可防止可“查看”數據的其他類型的應用(比如地圖應用)被 Intent 觸發。

驗證是否存在接收 Intent 的應用

盡管 Android 平台保證某些 Intent 可以分解為內置應用之一(比如,“電話”、“電子郵件”或“日歷”應用),您應在調用 Intent 之前始終包含確認步驟。

注意:

如果您調用了 Intent,但設備上沒有可用於處理 Intent 的應用,您的應用將崩潰。

要確認是否存在可響應 Intent 的可用 Activity,請調用 queryIntentActivities() 來獲取能夠處理您的 Intent 的 Activity 列表。如果返回的 List 不為空,您可以安全地使用該 Intent。例如:

PackageManager packageManager = getPackageManager();
List activities = packageManager.queryIntentActivities(intent,
        PackageManager.MATCH_DEFAULT_ONLY);
boolean isIntentSafe = activities.size() > 0;

如果 isIntentSafe 是 true,則至少有一個應用將響應該 Intent。 如果它是 false,則沒有任何應用處理該 Intent。

注:

在您需要在用戶嘗試使用它之前停用使用該 Intent 的功能時,您應在 Activity 初次啟動時執行此檢查。 如果您了解可處理 Intent 的特定應用,您還可以為用戶提供下載該應用的鏈接(請參閱如何在 Google Play 鏈接到您的產品)。

啟動具有 Intent 的 Activity

這裡寫圖片描述
圖 當多個應用可處理 Intent 時顯示的選擇對話框示例。<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPtK7tanE+tLRtLS9qMT6tcQgSW50ZW50ILKiyejWwyBleHRyYSDQxc+io6y199PDIHN0YXJ0QWN0aXZpdHkoKSC9q8bkt6LLzbj4z7XNs6GjyOe5+8+1zbPKtrHwv8m0psDtIEludGVudCC1xLbguPYgQWN0aXZpdHmjrMv8u+HOqtPDu6fP1Mq+ttS7sL/yuanG5NGh1PHSqsq508O1xNOm08OjrMjnzbwgy/nKvqGjyOe5+9a709DSu7j2IEFjdGl2aXR5ILSmwO0gSW50ZW50o6zPtc2zu+HBory0vavG5Mb0tq+hozwvcD4NCjxoMSBpZD0="例子">例子

startActivity(intent);
此處顯示完整的示例:如何創建查看地圖的 Intent,驗證是否存在處理 Intent 的應用,然後啟動它:

// Build the intent
Uri location = Uri.parse(“geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California”);
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);

// Verify it resolves
PackageManager packageManager = getPackageManager();
List activities = packageManager.queryIntentActivities(mapIntent, 0);
boolean isIntentSafe = activities.size() > 0;

// Start an activity if it’s safe
if (isIntentSafe) {
startActivity(mapIntent);
}

顯示應用選擇器
這裡寫圖片描述
圖 選擇器對話框。

注意,當您通過將您的 Intent 傳遞至 startActivity() 而啟動 Activity 時,有多個應用響應 Intent,用戶可以選擇默認使用哪個應用(通過選中對話框底部的復選框;見圖 1)。當執行用戶通常希望每次使用相同應用進行的操作時,比如當打開網頁(用戶可能只使用一個網絡浏覽器)或拍照(用戶可能習慣使用一個相機)時,這非常有用。

但是,如果要執行的操作可由多個應用處理並且用戶可能 習慣於每次選擇不同的應用 — 比如“共享”操作, 用戶有多個應用分享項目 — 您應明確顯示選擇器對話框, 如圖 2 所示。選擇器對話框 強制用戶選擇用於每次操作的 應用(用戶不能對此操作選擇默認的應用)。

要顯示選擇器

請使用 createChooser() 創建Intent 並將其傳遞給 startActivity()。例如:

Intent intent = new Intent(Intent.ACTION_SEND);
…

// Always use string resources for UI text.
// This says something like “Share this photo with”
String title = getResources().getString(R.string.chooser_title);
// Create intent to show chooser
Intent chooser = Intent.createChooser(intent, title);

// Verify the intent will resolve to at least one activity
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(chooser);
}

這將顯示一個對話框,其中包含響應傳遞給 createChooser() 方法的 Intent 的應用列表,並且將提供的文本用作對話框標題。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved