Android App之間通過Intent交互

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

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

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

码报201903期:構建隱含 Intent

码报开奖结果本期 www.iwqgw.icu 隱含 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(“//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]"}); // recipientsemailIntent.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 Uris1234567812345678

創建日歷事件:

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");12345671234567

注:

只有 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;12341234

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

注:

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

啟動具有 Intent 的 Activity

這里寫圖片描述 
圖 當多個應用可處理 Intent 時顯示的選擇對話框示例。

一旦您已創建您的 Intent 并設置 extra 信息,調用 startActivity() 將其發送給系統。如果系統識別可處理 Intent 的多個 Activity,它會為用戶顯示對話框供其選擇要使用的應用,如圖 所示。如果只有一個 Activity 處理 Intent,系統會立即將其啟動。

例子

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 的應用列表,并且將提供的文本用作對話框標題。

來源:CSDN博客-fengsehng

上一篇: Android 7.1.1正式發布,推出“Android版3D Touch”功能

下一篇: 歐盟嚴令谷歌停止Android壟斷行為,谷歌或將面臨巨額???/a>

绝密后三组六稳赚方法 北京pk10绝对作假 pk10走势图高级技巧 pk10赛车开奖记录 双色球胆拖复式投注和中奖查询表 彩圈吧app七星彩 十一选五买一个好稳赚技巧 双色球冷热温号是怎么规定的 稳赚包六肖 3期包出1期 彩神vii安卓版 鱼丸游戏qq版下载 复式6码二中二是怎么样的 打鱼一夜输了5万 二十一点安卓游戏在线 北京pk赛车7码计划规律 安徽时时计划软件手机版下载手机版下载手机版