在 com.example.pkg2.Act 中嘗試用 intent.setClassName(Act.this, "com.example.pkg1.Act1") 啟動不同包名下的 Activity,拋出 Unable to find explicit activity class。原因是第一參數若為 Context,系統會嘗試在「該 Context 所屬包名」下尋找類別,導致包名錯誤拼接。
// 寫法 1:字串完整類別名(需確保目標 Activity 在 Manifest 宣告 android:name="完整類別名")
intent.setClassName("com.example.pkg1", "com.example.pkg1.Act1");
// 寫法 2:直接用 Class 物件(編譯期檢查,最推薦)
intent.setClassName(this, Act1.class); // 自動解析包名與類別名
// 或
intent.setClass(this, Act1.class); // 等同效果,更簡潔
<activity android:name="com.example.pkg1.Act1" /> <!-- 必須寫完整包名 -->
<activity android:name="com.example.pkg1.Act2" />
<activity android:name="com.example.pkg2.Act" />
若目標 Activity 在同一專案模組,直接用 Act1.class 最安全;若為動態插件/外部 APK,才需字串形式並確保目標已安裝且 exported="true"。
Act.this,改傳包名字串或直接用 setClass。android:exported="true"(API 31+ 預設 false),外部啟動會失敗。FLAG_ACTIVITY_NEW_TASK。