android學習(五) 向另一個應用發送用戶 Intent

構建隱含Intent

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


如果數據是Uri,可以使用一個簡單的Intent()構造函數來定義操作和數據。
例如,此處顯示如何使用指定電話號碼的 Uri 數據創建發起電話呼叫的 Intent:

Uri number = Uri.parse("tel:12341234");
Intent callIntent = new Intent(Intent.ACTION_DIAL,number);
startActivity(callIntent);

這裏有一些其他 Intent 及其操作和 Uri 數據對:
查看地圖:

//基於地址的地圖點
Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
//基於圖的點或緯度/經度.位置= 。
Uri.parse("geo:37.422219,-122.08364?z=14"); // z 是一個縮放參數水平
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 emailIntent = new Intent(Intent.ACTION_SEND);
//這個Intent沒有URI所以聲明"text/plain"MIME類型
emailIntent.setType("text/plain");
emailIntent.putExtra(Intent.EXTRA_EMAIL,new String[]{"[email protected]"});
emailIntent.putExtra(Intent.EXTRA_SUBJECT,"email subject");
emailIntent.putExtra(Intent.EXTRA_TEXT,"Email message test");
emailIntent.putExtra(Intent.EXTRA_STREAM,Uri.parse("content://path/to/email/attachment"))

創建日曆事件

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);
//如果 isIntentSafe 是 true,則至少有一個應用將響應該 Intent。 如果它是 false,則沒有任何應用處理該 Intent。
boolean isIntentSafe = activities.size() > 0;

:在您需要在用戶嘗試使用它之前停用使用該 Intent 的功能時,您應在 Activity 初次啓動時執行此檢查。


啓動具有Intent的Activity

Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);

PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(mapIntent, 0);
boolean isIntentSafe = activities.size() > 0;

// 如果安全就啓動activity
if (isIntentSafe) {
    startActivity(mapIntent);
}

顯示應用選擇器

//標題
String title = getResources().getString(R.string.chooser_title);
//創建應用選擇器
Intent chooser = Intent.createChooser(intent, title);
if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(chooser);
}

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


摘自android developer

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