2017-06-06 58 views
0

從我的包中的類,我嘗試在包B.啓動活動android.content.ActivityNotFoundException:無法找到明確的活動課的時候調用StartActivity()

它工作正常,當我嘗試這樣:

new Intent(getApplicationContext(), ClassB.class); 

然而,當嘗試通過這種方式創建Intent

ComponentName componentName = ComponentName.unflattenFromString("com.example.package/.ClassB"); 

它提供了錯誤:**android.content.ActivityNotFoundException:** Unable to find explicit activity class {};你在宣佈本次活動您AndroidManifest.xml?我的問題是需要通過ComponentName才能稱爲第二種方式。

儘管我已經提到了這個問題的所有相關循環,但沒有找到解決方案。此外,我宣佈我的表現像下面(否則我想它不會被通過第1種方法調用)OK:

<activity android:name="com.example.package.ClassB" 
    android:exported="true" 
    android:excludeFromRecents="true" /> 

請檢查是否可能幫助?這兩個軟件包也是同一個App的一部分。

+0

你確定軟件包名稱是「com.example.package」嗎?是不是你在gradle中改變它的給定變體? – Selvin

+0

你可以試試看:ComponentName.createRelative(「com.example.package」,「ClassB」); – X3Btel

+0

@Selvin是,雙重保證.. –

回答

0

如果你在你的問題中寫道一切是正確的,那麼你的應用程序的應用程序ID不com.example.package。因此,更改:

ComponentName componentName = ComponentName.unflattenFromString("com.example.package/.ClassB"); 

到:

ComponentName componentName = ComponentName.unflattenFromString("xxx/com.example.package.ClassB"); 

其中xxx是您的應用程序的應用程序ID。特別是,組件名稱的右側應該是清單中<activity>android:name值,左側應該是應用程序的應用程序ID。您可以隨時撥打getComponentName()進行一項活動,以查找其ComponentName(例如,登錄LogCat以查看它的外觀)。

然後,重新考慮這樣做。雖然你寫「你需要通過ComponentName調用第二條路」,但我想不出任何需要ComponentName的場景。

例如,假設您正在保存的ComponentName的字符串表示在文件中。這是有風險的,因爲這意味着您永遠不能重構您的應用程序,否則您保存的ComponentName值將失效。相反,在表示邏輯活動的文件中保存一些內容,並將應用程序代碼映射到適當的Java類以用於明確的Intent

+0

工程完美..感謝CommonsWare爲您提供幫助。然而,我對開發人員站點上的描述有些困惑,或者我缺少一些東西:FlattenToString 在API級別1中添加了 String flattenToString() 返回一個字符串,明確描述了ComponentName中包含的包和類名稱。您可以稍後通過unflattenFromString(String)從此字符串中恢復ComponentName。 返回 字符串\t返回一個新的包含包和類名稱的String。這表示爲**包名稱**,與「/」連接,然後是類名稱。沒有提及應用程序標識? –

+0

@SahilMehta android中的應用程序ID通常是包名 - 在測試用例'com.example.package'中 – X3Btel

+0

@ X3Btel是的,但根據我的情況,它也可能不同,所以可以指定應用程序ID可以讓事情更清楚。 –

相關問題