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

Android 跨 Package 啟動 Activity:正確使用 setClassName

     編輯:程式設計綜合問答

錯誤現象

在 com.example.pkg2.Act 中嘗試用 intent.setClassName(Act.this, "com.example.pkg1.Act1") 啟動不同包名下的 Activity,拋出 Unable to find explicit activity class。原因是第一參數若為 Context,系統會嘗試在「該 Context 所屬包名」下尋找類別,導致包名錯誤拼接。

正確寫法:傳入完整類別名稱或 Class 物件

// 寫法 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);      // 等同效果,更簡潔

Manifest 宣告檢查

<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。
  • 目標 Activity 若未在 Manifest 設 android:exported="true"(API 31+ 預設 false),外部啟動會失敗。
  • 跨進程啟動需注意 FLAG_ACTIVITY_NEW_TASK。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved