1. 程式人生 > >Android App之間通過Intent互動

Android App之間通過Intent互動

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 時顯示的選擇對話方塊示例。

一旦您已建立您的 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 的應用列表,並且將提供的文字用作對話方塊標題。

我的微信二維碼如下,歡迎交流討論

這裡寫圖片描述

歡迎關注《IT面試題彙總》微信訂閱號。每天推送經典面試題和麵試心得技巧

微信訂閱號二維碼如下:

這裡寫圖片描述

相關推薦

Android App之間通過Intent互動

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

Android手機之間通過聲音傳輸資訊方法——聲波通訊(含工程程式碼)

大家可能都用過支付寶的聲波支付,即兩個終端同時開啟該功能,一個終端作為傳送端send,一個終端作為接收端get,send將本終端上發出的請求資訊按照約定規則的演算法進行聲音編碼,並播放出來,get端接收到send發來的聲音資料,按照約定規則進行解碼,即獲得了相應的資訊。 原

Android App通過JNI從驅動獲取Input Event

package com.jiagutech.input; import java.util.LinkedList; import android.os.Handler; public class InputPen { /*******************************

兩個Activity之間通過Intent相互(雙向)傳遞資料

兩個Activity通過Intent相互交換資料,在Activity中用一個Button 選擇是否接受資料,不能直接寫在onCreate中否則在Activity1 中獲取從Activity2傳送的資料時會崩潰,原因是因為在Activity中會通過Intent再建立一個Act

Android Activity之間intent傳大量資料失敗

由於業務要求,需要在Activity之間傳遞拍攝的照片,最初是直接使用Intent進行傳遞的,後來在做相容性測試時,發現有些手機無法跳轉至下一個頁面,而且沒有報任何異常。因此只能單步除錯,最後將錯誤鎖定在了Intent傳遞資料部分。 註釋掉putExtras照片資料的程式碼

AndroidAppApp之間互動

今天剛好公司有一個Android無介面外掛化的列印App需求,隨便在這裡寫下一點心得 知識點分析: 無介面 可比本公司的其他App任意呼叫 隱藏App的啟動圖示 一. 外掛App: (一)修改ac

Android基礎】利用Intent在Activity之間傳遞數據

一次 there center ack and block for success display 前言: 上一篇文章給大家聊了Intent的使用方法。怎樣用Intent啟動Activity和隱式Intent。這一篇文章給大家聊聊怎樣利用Intent在Activit

Android通過Intent.ACTION_CLOSE_SYSTEM_DIALOGS監聽Home按鍵消息

後門 str eve log reason anr rri dem .sh Android對屏幕下方經常使用的四個按鍵消息處理是不一致的: 1、搜索按鍵的消息在onKeyDown或者onKeyUp中接收; 2、菜單按鍵的消息在onCreateOptionsMen

如何通過Intent啟動一個已經安裝好的APP

首先你需要一個工具來提取APK的包名,我們要用到的工具是APK helper 該工具將APK安裝包拖到窗體上後,便可顯示APK的包名等詳細資訊。 得到包名以後 用以下程式碼,即可 private void doStartApplicationWithPackageName(Stri

Android官方文件—APP清單(intent-filter)

<intent-filter> 語法: <intent-filter android:icon="drawable resource" android:label="string resource"

Android在一個APP通過包名或類名啟動另一個APP

開發有時需要在一個應用中啟動另一個應用,比如Launcher載入所有的已安裝的程式的列表,當點選圖示時可以啟動另一個應用。一般我們知道了另一個應用的包名和MainActivity的名字之後便可以直接通過如下程式碼來啟動: [java] 

Android實現Fragment與Activity之間的資料互動

1概念 1 為什麼 因為Fragment和Activity一樣是具有生命週期,不是一般的bean通過建構函式傳值,會造成異常。 2 參考連結 Activity和Fragment傳遞資料的兩種方式 【Fragment精深系列4】Frag

Android 開發】: Android客戶端與服務端之間使用JSON互動資料。

    在前面的兩講中,我們講解了JSON資料格式的一些基本知識,以及做一些小Demo,這一講我們在前面的基礎上來做一個綜合的可擴充套件的Demo,主要是針對Android客戶端解析服務端傳遞過來的JSON資料。整個Demo所作的操作如下圖所示 1. 服務端    服務端

android,ios與web互動-—APP使用H5頁面

  一、ios與H5之間的互動 <!DOCTYPE html>   <html>   <meta charset="utf-8">

Android 7.1 SElinux許可權問題解決方案——編寫APP通過暗碼讀取TP fw版本

1.在底層,建立節點並給予訪問節點的許可權 2.在頂層新增暗碼和呼叫的函式 3.編寫app ReadHwid 4.編寫app完後,發現通過電話撥號鍵 暗碼*#850208# 顯示:TP SW Version hello world! 5.許可權解決方案 附加知識點 1、在底層,建立節點並

Android開發——通過 Intent 傳遞類物件

在android開發中,經常會使用Intent來傳遞資料,在Google官方的android api中對於基本資料型別,Intent類中都有對應的方法 intent.putExtra(key,date);來傳遞資料 然而在實際開發中,基本資料型別肯定是不能夠

Android本地App與html5的互動

介紹: Android的開發中除了本地app的處理外,有時需要與html5的互動,與html5的互動無非兩種情況。 1:html5呼叫app本地的方法。 例如,在一個網頁上點選一個分享按鈕控制元件,這時會彈出本地原生的一鍵分享介面,通過html5呼叫本地方法將值傳給本地分

Android使用ListView構造複雜介面,響應點選事件,通過Intent跳轉activity

友情連結 vrix的部落格http://blog.csdn.net/vrix/article/details/5953710 雨鬆MOMO的程式世界專欄http://blog.csdn.net/xys289187120?viewmode=list

Android 開發】: Android客戶端與服務端之間使用GSON互動資料。

    前面我們有提到google的Gson技術的介紹[GSON 資料格式詳解],這一講我們來詳細學習一下Android客戶端與服務端之間使用GSON進行JSON資料的解析,關於GSON的技術我們已經在前面兩講中提到過,對GSON不瞭解的讀者可以先去看前面兩講的博文,這一講

Android中實現Service動態更新UI介面(Service與主程式Activity之間的資料互動或控制)

案例:通過service向遠端伺服器傳送請求,根據伺服器返回的結果動態更新主程式UI介面,主程式可實時關閉或重啟服務。 方案一:使用廣播+Service註冊BroadcastReceiver 1、在主程式activity中註冊一個BroadcastReceiver