首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android Intent 啟動失敗:No Activity found to handle Intent 完整排查

     編輯:程式設計疑難解答

錯誤現場還原

開發者在 MainActivity 中通過隱式 Intent 啟動 TestActivity:

public void click2(View v) {
    Intent intent2 = new Intent();
    intent2.setAction("com.ahut.test1");
    intent2.addCategory("android.intent.category.LAUNCHER");
    startActivity(intent2);
}

報錯:ActivityNotFoundException: No Activity found to handle Intent { act=com.ahut.test1 cat=[android.intent.category.LAUNCHER] }

AndroidManifest.xml 關鍵配置

<activity android:name="com.ahut.newactivity.TestActivity" android:label="這是第二個頁面">
    <intent-filter>
        <action android:name="com.ahut.test1" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

核心錯誤原因

一個應用只能有一個 LAUNCHER 類別的 Activity。
MainActivity 已聲明 <category android:name="android.intent.category.LAUNCHER" />,使其成為桌面圖標入口。
TestActivity 再次聲明同類別,導致系統無法確定哪個是真正的 Launcher 入口,解析 Intent 時匹配失敗。

正確修復方案

方案一:移除 TestActivity 的 LAUNCHER 類別(推薦)

<activity android:name="com.ahut.newactivity.TestActivity" android:label="這是第二個頁面">
    <intent-filter>
        <action android:name="com.ahut.test1" />
        <category android:name="android.intent.category.DEFAULT" /> <!-- 改為 DEFAULT -->
    </intent-filter>
</activity>

DEFAULT 類別表示該 Activity 可接收隱式 Intent,是標準做法。

方案二:使用顯式 Intent 直接啟動(更簡潔、性能更好)

public void click2(View v) {
    Intent intent = new Intent(this, TestActivity.class); // 顯式指定目標類
    startActivity(intent);
}

無需在 Manifest 添加 intent-filter,直接通過類名啟動,避免隱式解析開銷與匹配風險。

知識點延伸:Intent 匹配機制

  • 顯式 Intent:指定組件類名(setClass 或構造函數),系統直接啟動,不做解析。
  • 隱式 Intent:僅聲明 Action、Category、Data,系統查詢所有已安裝應用的 intent-filter 進行匹配。
  • 匹配規則:Action 必須完全一致;Category 要求 Intent 中聲明的每個 Category 都在 Filter 中存在(Filter 可有更多);Data 需匹配 MIME type/Scheme/Host/Port/Path。
  • LAUNCHER 類別專用於桌面啟動器,系統保證每個應用僅有一個入口,重複聲明會導致歧義。

最佳實踐總結

  1. 應用內部頁面跳轉 優先使用顯式 Intent,安全、高效、無解析失敗風險。
  2. 僅在需響應外部調用(如分享、打開鏈接、第三方喚起)時聲明隱式 Intent Filter。
  3. LAUNCHER 類別 全應用唯一,切勿在多個 Activity 添加。
  4. 隱式 Intent 必須包含 DEFAULT 類別(除非針對特定系統行為),否則無法匹配。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved