開發者在 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] }
<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 時匹配失敗。
<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,是標準做法。
public void click2(View v) {
Intent intent = new Intent(this, TestActivity.class); // 顯式指定目標類
startActivity(intent);
}
無需在 Manifest 添加 intent-filter,直接通過類名啟動,避免隱式解析開銷與匹配風險。
setClass 或構造函數),系統直接啟動,不做解析。intent-filter 進行匹配。LAUNCHER 類別專用於桌面啟動器,系統保證每個應用僅有一個入口,重複聲明會導致歧義。LAUNCHER 類別 全應用唯一,切勿在多個 Activity 添加。DEFAULT 類別(除非針對特定系統行為),否則無法匹配。