![](/img/trans.png)
[英]Why does intent.resolveActivity(getPackageManager()) return null even though there is Activity to handle it?
[英]What exactly is intent.resolveActivity(getPackageManager()) doing?
我正在閱讀Android 開發人員教程<\/a>,遇到了一行我不理解的代碼。
這是代碼行(可在 Android 開發者教程的第 4 頁找到。)
Intent intent = new Intent(Intent.ACTION_VIEW, webpage);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
但是,這里正在創建什么樣的隱式意圖?
嗯... ACTION_VIEW
Intent
,用於查看請求的URL。
我是否可以將Android視為遍歷手機中的所有類,看看哪個具有可以處理數據的意圖過濾器並創建意圖結構以啟動它發現的此類?
活動在清單中注冊。 操作系統基本上具有所有已注冊活動及其<intent-filter>
詳細信息的數據庫,並且使用該數據庫查找任何給定隱式Intent
候選對象。
它只是選擇默認值還是要求用戶選擇要在其上運行的應用程序?
這取決於多種因素,包括:
用戶是否為這種Intent
選擇了默認處理程序(例如,選擇了默認的Web瀏覽器)
是否使用Intent.createChooser()
包裝Intent
以強制選擇器
應用程序是否已為URL注冊了應用程序鏈接
如果該意圖已經鏈接到要啟動的類,那么為什么還要打擾intent.resolveActivity(getPackageManager())呢?
因為可能有零個活動來處理Intent
。 即使對於像Web瀏覽器一樣常見的東西,特定用戶也可能無權訪問瀏覽器應用程序(輔助用戶配置文件等)。 如果嘗試啟動活動,但沒有匹配項,則會收到ActivityNotFoundException
,因此此檢查試圖避免此類異常。
但是我可以說Intent.ACTION_VIEW運行intent.resolveActivity(getPackageManager())或另一個類似但又以某種方式將返回的類合並到我的意圖中的函數是否正確?
並不是的。 如果說resolveActivity()
查詢我提到的數據庫以查看將處理Intent
(如果有的話),那將是更正確的說法。
包管理器類里面有什么?
一點Java代碼。 它主要是通往核心OS進程的IPC網關,用於查詢已安裝應用程序及其功能等的數據庫。
順便說一句,由於添加了新限制,此方法可以在 Android 11 及更高版本上返回 null: https<\/a> :\/\/developer.android.com\/about\/versions\/11\/privacy\/package-visibility 所以要解決這個問題,我們必須添加一個查詢在清單下:
<queries>
<intent>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https" />
</intent>
</queries>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.