編輯:關於Android編程
Intent是一個消息傳遞對象,您可以使用它從其他應用組件請求操作。盡管 Intent 可以通過多種方式促進組件之間的通信,但其基本用例主要包括以下三個:
1.啟動 Activity:
Activity 表示應用中的一個屏幕。通過將 Intent 傳遞給 startActivity(),您可以啟動新的 Activity 實例。Intent 描述了要啟動的 Activity,並攜帶了任何必要的數據。如果您希望在 Activity 完成後收到結果,請調用 startActivityForResult()。在 Activity 的 onActivityResult() 回調中,您的 Activity 將結果作為單獨的 Intent 對象接收。
2.啟動服務:
Service是一個不使用用戶界面而在後台執行操作的組件。通過將 Intent 傳遞給 startService(),您可以啟動服務執行一次性操作(例如,下載文件)。Intent 描述了要啟動的服務,並攜帶了任何必要的數據。如果服務旨在使用客戶端-服務器接口,則通過將 Intent 傳遞給 bindService(),您可以從其他組件綁定到此服務。
3.傳遞廣播:
廣播是任何應用均可接收的消息。系統將針對系統事件(例如:系統啟動或設備開始充電時)傳遞各種廣播。通過將 Intent 傳遞給 sendBroadcast()、sendOrderedBroadcast() 或 sendStickyBroadcast(),您可以將廣播傳遞給其他應用。
圖 1.隱式 Intent 如何通過系統傳遞以啟動其他 Activity 的圖解
(1)Activity A 創建包含操作描述的intent,並將其傳遞給startActivity。
(2)Android 系統搜索所有應用中與 Intent 匹配的 Intent 過濾器。找到匹配項之後。
(3)該系統通過調用匹配 Activity(Activity B)的onCreate方法並將其傳遞給Intent,以此啟動匹配 Activity。
警告:為了確保應用的安全性,啟動 Service 時,請始終使用顯式 Intent,且不要為服務聲明 Intent 過濾器。使用隱式 Intent 啟動服務存在安全隱患,因為您無法確定哪些服務將響應 Intent,且用戶無法看到哪些服務已啟動。從 Android 5.0(API 級別 21)開始,如果使用隱式 Intent 調用 bindService(),系統會拋出異常。
static final String ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL";3.數據(data):引用待操作數據和/或該數據 MIME 類型的 URI(Uri 對象)。 提供的數據類型通常由 Intent 的操作決定。例如,如果操作是 ACTION_EDIT,則數據應包含待編輯文檔的 URI。 創建 Intent 時,除了指定 URI 以外,指定數據類型(其 MIME 類型)往往也很重要。例如,能夠顯示圖像的Activity可能無法播放音頻文件,即便 URI 格式十分類似時也是如此。因此,指定數據的 MIME 類型有助於 Android 系統找到接收 Intent 的最佳組件。但有時,MIME 類型可以從 URI 中推斷得出,特別當數據是 content: URI 時尤其如此。這表明數據位於設備中,且由 ContentProvider 控制,這使得數據 MIME 類型對系統可見。 要僅設置數據 URI,請調用 setData()。要僅設置 MIME 類型,請調用setType()。如有必要,您可以使用 setDataAndType() 同時顯式設置二者。 警告:若要同時設置 URI 和 MIME 類型,請勿調用 setData() 和 setType(),因為它們會互相抵消彼此的值。請始終使用setDataAndType() 同時設置 URI 和 MIME 類型。 4.類別(CATEGORY):一個包含應處理 Intent 組件類型的附加信息的字符串。 您可以將任意數量的類別描述放入一個 Intent 中,但大多數 Intent 均不需要類別。以下是一些常見類別: (1) CATEGORY_BROWSABLE 目標 Activity 允許本身通過 Web 浏覽器啟動,以顯示鏈接引用的數據,如圖像或電子郵件。 (2)CATEGORY_LAUNCHER 該 Activity 是任務的初始 Activity,在系統的應用啟動器中列出。 您可以使用 addCategory() 指定類別。 以上列出的這些屬性(組件名稱、操作、數據和類別)表示 Intent 的既定特征。通過讀取這些屬性,Android 系統能夠解析應當啟動哪個應用組件。但是,Intent 也有可能會一些攜帶不影響其如何解析為應用組件的信息。Intent 還可以提供: 5.Extra:攜帶完成請求操作所需的附加信息的鍵值對。 正如某些操作使用特定類型的數據 URI 一樣,有些操作也使用特定的附加數據。 您可以使用各種 putExtra() 方法添加附加數據,每種方法均接受兩個參數:鍵名(key)和值(value)。您還可以創建一個包含所有附加數據的 Bundle 對象,然後使用 putExtras() 將 Bundle 插入 Intent 中。例如,使用 ACTION_SEND 創建用於發送電子郵件的 Intent 時,可以使用 EXTRA_EMAIL 鍵指定“目標”收件人,並使用 EXTRA_SUBJECT 鍵指定“Theme”。 Intent 類將為標准化的數據類型指定多個 EXTRA_* 常量。如需聲明自己的附加數據 鍵(對於應用接收的 Intent ),請確保將應用的軟件包名稱作為前綴。例如:
static final String EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS";6.標志(flag): 在 Intent 類中定義的、充當 Intent 元數據的標志。標志可以指示 Android 系統如何啟動 Activity(例如,Activity 應屬於哪個 任務 ),以及啟動之後如何處理(例如,它是否屬於最近的 Activity 列表)。
// Executed in an Activity, so 'this' is the Context // The fileUrl is a string URL, such as "http://www.example.com/image.png" Intent downloadIntent = new Intent(this, DownloadService.class); downloadIntent.setData(Uri.parse(fileUrl)); startService(downloadIntent);Intent(Context, Class) 構造函數分別為應用和組件提供 Context 和 Class 對象。因此,此 Intent 將顯式啟動該應用中的 DownloadService 類。 2.隱式 Intent 示例 隱式 Intent 指定能夠在可以執行相應操作的設備上調用任何應用的操作。如果您的應用無法執行該操作而其他應用可以,且您希望用戶選取要使用的應用,則使用隱式 Intent 非常有用。
// Create the text message with a string
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);
sendIntent.setType("text/plain");
// Verify that the intent will resolve to an activity
if (sendIntent.resolveActivity(getPackageManager()) != null) {
startActivity(sendIntent);
}
注意:在這種情況下,系統並沒有使用 URI,但已聲明 Intent 的數據類型,用於指定 Extra 攜帶的內容。
調用 startActivity() 時,系統將檢查已安裝的所有應用,確定哪些應用能夠處理這種 Intent(即:含 ACTION_SEND 操作並攜帶“text/plain”數據的 Intent )。如果只有一個應用能夠處理,則該應用將立即打開並提供給 Intent。如果多個 Activity 接受 Intent,則系統將顯示一個對話框,使用戶能夠選取要使用的應用。
3.強制使用應用選擇器
如果有多個應用響應隱式 Intent,則用戶可以選擇要使用的應用,並將其設置為該操作的默認選項。 如果用戶可能希望今後一直使用相同的應用執行某項操作(例如,打開網頁時,用戶往往傾向於僅使用一種 Web 浏覽器),則這一點十分有用。
但是,如果多個應用可以響應 Intent,且用戶可能希望每次使用不同的應用,則應采用顯式方式顯示選擇器對話框。選擇器對話框要求用戶選擇每次操作要使用的應用(用戶無法為該操作選擇默認應用)。例如,當應用使用 ACTION_SEND 操作執行“共享”時,用戶根據目前的狀況可能需要使用另一不同的應用,因此應當始終使用選擇器對話框,如圖 2 中所示。
圖 2. 選擇器對話框。
要顯示選擇器,請使用 createChooser() 創建 Intent,並將其傳遞給 startActivity()。例如:
Intent sendIntent = 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 the chooser dialog
Intent chooser = Intent.createChooser(sendIntent, title);
// Verify the original intent will resolve to at least one activity
if (sendIntent.resolveActivity(getPackageManager()) != null) {
startActivity(chooser);
}
這將顯示一個對話框,其中包含響應傳遞給 createChooser() 方法的 Intent 的應用列表,並使用提供的文本作為對話框標題。
您可以創建一個包括多個 action、data或 &category實例的過濾器。創建時,僅需確定組件能夠處理這些過濾器元素的任何及所有組合即可。
如需僅以操作、數據和類別類型的特定組合來處理多種 Intent,則需創建多個 Intent 過濾器。
系統通過將 Intent 與所有這三個元素進行比較,根據過濾器測試隱式 Intent。隱式 Intent 若要傳遞給組件,必須通過所有這三項測試。如果 Intent 甚至無法匹配其中任何一項測試,則 Android 系統不會將其傳遞給組件。但是,由於一個組件可能有多個 Intent 過濾器,因此未能通過某一組件過濾器的 Intent 可能會通過另一過濾器。
警告:為了避免無意中運行不同應用的 Service,請始終使用顯式 Intent 啟動您自己的服務,且不必為該服務聲明 Intent 過濾器。
注意:對於所有 Activity,您必須在清單文件中聲明 Intent 過濾器。但是,廣播接收器的過濾器可以通過調用 registerReceiver() 動態注冊。稍後,您可以使用 unregisterReceiver() 注銷該接收器。這樣一來,應用便可僅在應用運行時的某一指定時間段內偵聽特定的廣播。
限制對組件的訪問:
第一個 Activity MainActivity 是應用的主要入口點。當用戶最初使用啟動器圖標啟動應用時,該 Activity 將打開:要通過此過濾器,您在 Intent 中指定的操作必須與過濾器中列出的某一操作匹配。...
若要 Intent 通過類別測試,則Intent 中的每個類別均必須與過濾器中的類別匹配。反之則未必然,Intent 過濾器聲明的類別可以超出 Intent 中指定的數量,且 Intent 仍會通過測試。因此,不含類別的 Intent 應當始終會通過此測試,無論過濾器中聲明何種類別均是如此。 注意:Android 會自動將 CATEGORY_DEFAULT 類別應用於傳遞給 startActivity() 和 startActivityForResult() 的所有隱式 Intent。因此,如需 Activity 接收隱式 Intent,則必須將 "android.intent.category.DEFAULT" 的類別包括在其 Intent 過濾器中(如上文的 intent-filter示例所示)。...
每個 元素均可指定 URI 結構和數據類型(MIME 介質類型)。URI 的每個部分均包含單獨的scheme、host、port 和 path 屬性:scheme://host:port/path...
則假定組件支持 content: 和 file: 數據。
最後一條規則,即規則 (d),反映了期望組件能夠從文件中或內容提供商處獲得本地數據。因此,其過濾器可以僅列出數據類型,而不必顯式命名 content: 和 file: 架構。這是一個典型的案例。例如,下文中的data元素向 Android 指出,組件可從內容提供商處獲得並顯示圖像數據:
...
由於大部分可用數據均由內容提供商分發,因此指定數據類型(而非 URI)的過濾器也許最為常見。
另一常見的配置是具有架構和數據類型的過濾器。例如,下文中的 data元素向 Android 指出,組件可從網絡中檢索視頻數據以執行操作:
...
靠譜助手怎麼輸入中文
手機上輸入中文相當容易,但是在靠譜助手這個電腦上的安卓模擬器要怎麼輸入中文呢?電腦上直接輸入中文根本沒反應啊?靠譜助手模擬器輸入中文需要安裝拼音輸入法。經小
Android使用SQLite數據庫的簡單實例
先畫個圖,了解下Android下數據庫操作的簡單流程:1.首先,寫一個自己的數據庫操作幫助類,這個類繼承自Android自帶的SQLiteOpenHelper.2.在自己
android 類似google Play Tab
最近要實現類似Google Play Tab效果,下面搜集一些問題,大家先看看問題以及回答 1、Android - Google Play like ta
Android應用性能優化系列視圖篇——SVG圖片版本兼容及性能優化解決方案
SVG矢量圖在圖片表現力方面遠遠優於PNG位圖,同時在可維護性和修改性方面也比位圖要方便很多。盡管Android在5.0版本就引入了SVG圖片的解決方案:Vector。然