Android進階(二十九) 走近 IntentFilter

文章目錄

    • 一、什么是IntentFilter ?
    • 二、IntentFilter 如何過濾隱式意圖?
      • 2.1 動作測試
      • 2.2 類別測試
      • 2.3 數據測試

一、什么是IntentFilter ?

如果一個 Intent 請求在一片數據上執行一個動作, Android 如何知道哪個應用程序(和組件)能用來響應這個請求呢?

IntentFilter就是用來注冊 ActivityServiceBroadcast Receiver 具有能在某種數據上執行一個動作的能力。

使用 IntentFilter ,應用程序組件告訴 Android ,它們能為其它程序的組件的動作請求提供服務,包括同一個程序的組件、本地的或第三方的應用程序。

IntentFilter翻譯成中文就是“意圖過濾器”,主要用來過濾隱式意圖。當用戶進行一項操作的時候,Android系統會根據配置的 “意圖過濾器” 來尋找可以響應該操作的組件,服務。

例如:當用戶點擊PDF文件的時候,Android系統就會通過設定好的意圖過濾器,進行匹配測試。找到能夠打開PDF文件的APP程序。

代碼:

<activity android:name="com.example.testmain.ShowActivity" ><intent-filter><action android:name="test.update.mydata" /><category android:name="my.test.show" /><data android:pathPattern=".*\\.jpg" android:scheme="http" /></intent-filter>
</activity>

二、IntentFilter 如何過濾隱式意圖?

Android系統會根據配置的Intent Filter(意圖過濾器),來進行匹配測試。匹配的時候,只會考慮三個方面:動作數據(URI以及數據類型)和類別。也就是說Android系統會進行“動作測試”,“數據測試”,“類別測試”,來尋找可以響應隱式意圖的組件或服務。

另外,當對其他App程序開放組件和服務的時候也需要配置Intent Filter(意圖過濾器),一個Activity可以配置多個<intent-filter>

2.1 動作測試

對應<intent-filter>中的<action/>標簽;

  1. 如果<intent-filter>標簽中有多個<action/>,那么Intent請求的Action,只要匹配其中的一條<action/>就可以通過了這條<intent-filter>的動作測試。

  2. 如果<intent-filter>中沒有包含任何<action/>,那么無論什么Intent請求都無法和這條<intent-filter>匹配。

  3. 如果Intent請求中沒有設定Action(動作),那么這個Intent請求就將順利地通過<intent-filter>的動作測試(前提是<intent-filter>中必須包含有<action/>,否則與第二條沖突)。

2.2 類別測試

對應<intent-filter>中的<category />標簽;

Intent中的類別必須全部匹配<intent-filter>中的<category />,但是<intent-filter>中多余的<category />將不會導致匹配失敗。

例如:Intent中有3個類別,而意圖過濾器中定義了5個,如果Intent中的3個類別都與過濾器中的匹配,那么過濾器中的另外2個,將不會導致類別測試失敗。

在這里插入圖片描述

注意:有一個例外,Android把所有傳給startActivity()的隱式意圖當作他們包含至少一個類別:“android.intent.category.DEFAULT” (CATEGORY_DEFAULT常量)。 因此,想要接收隱式意圖的活動必須在它們的意圖過濾器中包含"android.intent.category.DEFAULT"。(帶"android.intent.action.MAIN"和"android.intent.category.LAUNCHER"設置的過濾器是例外)

2.3 數據測試

對應<intent-filter>中的<data>標簽;

<data>元素指定了可以接受的Intent傳過來的數據URI和數據類型,當一個意圖對象中的URI被用來和一個過濾器中的URI比較時,比較的是URI的各個組成部分。

例如:

如果過濾器僅指定了一個scheme,所有該schemeURIs都能夠和這個過濾器相匹配;

如果過濾器指定了一個scheme、主機名但沒有路經部分,所有具有相同scheme和主機名的URIs都可以和這個過濾器相匹配,而不管它們的路經;

如果過濾器指定了一個scheme、主機名和路經,只有具有相同scheme、主機名和路經的URIs才可以和這個過濾器相匹配。當然,一個過濾器中的路徑規格可以包含通配符,這樣只需要部分匹配即可。
比較規則如下:

  1. 一個既不包含URI也不包含數據類型的意圖對象,僅在過濾器也同樣沒有指定任何URI和數據類型的情況下才能通過測試。

  2. 一個包含URI但沒有數據類型的意圖對象,僅在它的URI和一個同樣沒有指定數據類型的,過濾器里的URI匹配時才能通過測試。這通常發生在類似于mailto:和tel:這樣的URIs上:它們并不引用實際數據。

  3. 一個包含數據類型但不包含URI的意圖對象,僅在這個過濾器列舉了同樣的數據類型,而且也沒有指定一個URI的情況下才能通過測試。

  4. 一個同時包含URI和數據類型(或者可從URI推斷出數據類型)的意圖對象可以通過測試,如果它的類型和過濾器中列舉的類型相匹配的話。如果它的URI和這個過濾器中的一個URI相匹配或者它有一個內容content:或者文件file: URI,而且這個過濾器沒有指定一個URI,那么它也能通過測試。換句話說,一個組件被假定為支持”content: 數據“ 和 “file: 數據”,如果它的過濾器僅列舉了一個數據類型。

例如AndroidManifest.xmlAndroidManifest.xml是安卓開發中主配置文件,程序執行首先瀏覽這個文件的內容)中有:

對于<intent-filter>中的action項可以有多個只要匹配其中一個就可以了

intent.setAction("com.nanlove.wangshiming");//中的action也可以為wangshimingintent.addCategory("wangshiming.intent.category")// 代碼中的addCategory并不用寫因為android他有默認的category 只要配置清單中存在<category android:name="android.intent.category.DEFAULT" />就可以了.

沒有 “數據參數” 的情況下只要意圖對象中的設置動作和類別都出現在intent-filter就能跟filter匹配,但是有數據<data android:scheme="love" android:host="hao123.com" android:port="888" android:path="/MM" />數據項一定要完全匹配。

當數據和數據類型 android:mimeType="text/plain"同時存在的時候,不能使用intent.setData(Uri.parse("love://hao123.com:888/MM")) ;

因為setData的方法會自動清除前面的數據類型:This method automatically clears any type that was previously set by setType;

所以后面的setType就無法匹配,應該使用intent.setDataAndType(Uri.parse("love://hao123.com:888/MM"), "text/plain");

提示:在同一個應用內,能使用顯示意圖,就盡量使用顯示意圖,增加程序的效率,理論上隱式意圖匹配規則是需要花時間尋找的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/697039.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/697039.shtml
英文地址,請注明出處:http://en.pswp.cn/news/697039.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

網頁數據的解析提取(XPath的使用----lxml庫詳解)

在提取網頁信息時&#xff0c;最基礎的方法是使用正則表達式&#xff0c;但過程比較煩瑣且容易出錯。對于網頁節點來說&#xff0c;可以定義id、class或其他屬性&#xff0c;而且節點之間還有層次關系&#xff0c;在網頁中可以通過XPath或CSS選擇器來定位一個或多個節點。那么&…

Maven管理項目,本地倉庫有對應的jar包,但還是報找不到

文章目錄 業務場景錯誤提示分析過程解決辦法 業務場景 settings.xml種配置了私服&#xff0c;但是有些依賴私服上沒有&#xff0c;通過同事拷貝過來的。但是用maven打包時報紅了。 錯誤提示 Idea Maven錯誤&#xff1a;was cached in the local repository, resolution will…

RecycleView結合ItemTouchHelper實現拖動排序

最近項目中需要實現對某一類條目進行拖動排序功能&#xff0c;實現技術方案就是利用ItemTouchHelper綁定RecyclerView、ItemTouchHelper.Callback來實現UI更新&#xff0c;并且實現動態控制是否開啟拖動功能。其中&#xff0c;ItemTouchHelper是Google在androidx包中添加的&…

int128的實現(基本完成)

雖然有一個聲明叫_int128但是這并不是C標準&#xff1a; long long 不夠用&#xff1f;詳解 __int128 - FReQuenter - 博客園 (cnblogs.com) 網絡上去找int128的另類實現方法&#xff0c;發現幾乎都是在介紹_int128的 然后我就自己想了個辦法&#xff0c;當時還沒學C&#xf…

Spring Boot中實現列表數據導出為Excel文件

點擊下載《Spring Boot中實現列表數據導出為Excel文件》 1. 前言 本文將詳細介紹在Spring Boot框架中如何將列表數據導出為Excel文件。我們將通過Apache POI庫來實現這一功能&#xff0c;并解釋其背后的原理、提供完整的流程和步驟&#xff0c;以及帶有詳細注釋的代碼示例。最…

關于設備連接有人云的使用及modbus rtu協議,服務器端TCP調試設置

有人云調試 調試過程問題1. 關于modbus rtu協議,實質上有三種modbus基本原理modbus 格式2. 關于modbus crc16通信校驗3. 關于在ubuntu阿里云服務器端,監聽網絡數據之調試mNetAssist之前的一個項目,再拿出來回顧下。 調試過程 先 要在有人云,用手機號注冊一個服務賬號,官網顯…

家的情感記憶:如何用壁紙講述你的墻故事?

1、方小童在線工具集 網址&#xff1a; 方小童 該網站是一款在線工具集合的網站&#xff0c;目前包含PDF文件在線轉換、隨機生成美女圖片、精美壁紙、電子書搜索等功能&#xff0c;喜歡的可以趕緊去試試&#xff01;

HarmonyOS—使用預覽器查看應用/服務效果

DevEco Studio為開發者提供了UI界面預覽功能&#xff0c;可以查看應用/服務的UI界面效果&#xff0c;方便開發者隨時調整界面UI布局。預覽器支持布局代碼的實時預覽&#xff0c;只需要將開發的源代碼進行保存&#xff0c;就可以通過預覽器實時查看應用/服務運行效果&#xff0c…

探索分布式強一致性奧秘:Paxos共識算法的精妙之旅

提到分布式算法&#xff0c;就不得不提 Paxos 算法&#xff0c;在過去幾十年里&#xff0c;它基本上是分布式共識的代名詞&#xff0c;因為當前一批常用的共識算法都是基于它改進的。比如&#xff0c;Fast Paxos 算法、Cheap Paxos、Raft 算法等。 由萊斯利蘭伯特&#xff08;L…

Spring6學習技術|AOP

學習材料 尚硅谷Spring零基礎入門到進階&#xff0c;一套搞定spring6全套視頻教程&#xff08;源碼級講解&#xff09; AOP AOP&#xff08;Aspect Oriented Programming&#xff09;是一種設計思想&#xff0c;是軟件設計領域中的面向切面編程&#xff0c;它是面向對象編程的…

AIDL的工作原理與使用示例 跨進程通信 遠程方法調用RPC

AIDL的介紹與使用 AIDL&#xff08;Android Interface Definition Language&#xff09;是Android中用于定義客戶端和服務端之間通信接口的一種接口定義語言。它允許你定義客戶端和服務的通信協議&#xff0c;用于在不同的進程間或同一進程的不同組件間進行數據傳遞。AIDL通過…

深入探討YUV圖像處理:理論原理與OpenCV實踐

文章目錄 導言YUV模型的原理使用OpenCV處理YUV圖像1. 讀取YUV圖像2. 將YUV圖像轉換為RGB圖像3. 將RGB圖像轉換為YUV圖像 結語 導言 導言&#xff1a; 在圖像處理領域&#xff0c;YUV色彩模型因其對亮度和色度的分離而被廣泛使用&#xff0c;特別在視頻編碼和實時通信中發揮了巨…

算法項目(3)—— 從零實現KNN、樸素貝葉斯垃圾郵件分類

本文包含什么? 項目運行的方式項目代碼,自己實現KNN算法以及樸素貝葉斯算法.代碼介紹運行有問題? csdn上后臺隨時售后.項目說明 本文主要是自己從0實現KNN算法以及樸素貝葉斯算法.然后使用英文垃圾郵件數據集進行垃圾郵件分類.常見的代碼均調用sklearn庫來實現,本文自行實現…

AI推介-大語言模型LLMs論文速覽(arXiv方向):2024.01.01-2024.01.10

1.Pre-trained Large Language Models for Financial Sentiment Analysis 標題:用于金融情感分析的預訓練大型語言模型 author:Wei Luo, Dihong Gong date Time:2024-01-10 paper pdf:http://arxiv.org/pdf/2401.05215v1 摘要&#xff1a; 金融情感分析是指將金融文本內容劃分…

從零學習Linux操作系統第二十八部分 shell腳本中的執行流控制

一、什么是執行流、循環執行流 執行流&#xff1a;改變執行順序&#xff0c;使之更方便操作者 循環執行流&#xff1a;根據腳本是執行流再某一個狀態下進行循環執行&#xff0c;進行多次執行后再往下走&#xff08;for語句&#xff09; for語句 作用 為循環執行動作 for語句…

opencv判斷灰化情況

目的 先說說理論&#xff1a; 在圖像處理中&#xff0c;用RGB三個分量&#xff08;R&#xff1a;Red&#xff0c;G&#xff1a;Green&#xff0c;B&#xff1a;Blue&#xff09;&#xff0c;即紅、綠、藍三原色來表示真彩色&#xff0c;R分量&#xff0c;G分量&#xff0c;B分…

LeetCode LCR 055.二叉搜索樹迭代器

實現一個二叉搜索樹迭代器類BSTIterator &#xff0c;表示一個按中序遍歷二叉搜索樹&#xff08;BST&#xff09;的迭代器&#xff1a; BSTIterator(TreeNode root) 初始化 BSTIterator 類的一個對象。BST 的根節點 root 會作為構造函數的一部分給出。指針應初始化為一個不存在…

vue實現拖拽(vuedraggable)

實現效果: 左側往右側拖動&#xff0c;右側列表可以進行拖拽排序。 安裝引用&#xff1a; npm install vuedraggable import draggable from vuedraggable 使用&#xff1a; data數據&#xff1a; componentList: [{groupName: 考試題型,children: [{componentType: danxua…

SQLite 的使用

SQLite 是一個輕量級、自包含和無服務器的關系型數據庫管理系統&#xff08;RDBMS&#xff09;&#xff0c;廣泛應用于嵌入式系統、移動應用程序和小中型網站。它易于創建、需要的配置較少&#xff0c;并且提供了用于管理和操作數據的強大功能集。本文&#xff0c;我們將帶領你…

電路設計(26)——交通信號燈的multism仿真

1.功能要求 使用數字芯片設計一款交通信號燈&#xff0c;使得&#xff1a; 主干道的綠燈時間為60S&#xff0c;紅燈時間為45S 次干道的紅燈時間為60S&#xff0c;綠燈時間為45S 主、次干道&#xff0c;綠燈的最后5S內&#xff0c;黃燈閃爍 使用數碼管顯示各自的倒計時時間。 按…