android.content.ActivityNotFoundException: 找不到明确的活动类

29

我遇到了这个错误:

06-06 10:45:19.685: E/AndroidRuntime(554): android.content.ActivityNotFoundException: Unable to find explicit activity class {com.Android.myApp/com.Android.myApp.Facebook.Example}; have you declared this activity in your AndroidManifest.xml?

但是我已经在我的清单文件中声明了它。除此之外,还可能有其他原因导致这种异常情况吗?

我的 manifest.xml 文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.Android.myApp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="4" />

    <uses-feature android:name="android.hardware.camera" />

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.Light" >

        <activity
            android:name=".SignUpActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".SignInActivity"
            android:label="@string/app_name" />
        <activity
            android:name=".HomeActivity"
            android:label="@string/app_name" />
        <activity
            android:name=".selectCityActivity"
            android:label="@string/app_name" />
        <activity
            android:name=".FeedListViewActivity"
            android:label="@string/app_name" />
        <activity
            android:name=".SearchActivity"
            android:label="@string/app_name" />
        <activity
            android:name=".IWantActivity"
            android:label="@string/app_name" />
        <activity
            android:name=".DateActivity"
            android:label="@string/app_name" />
        <activity
            android:name=".ShareActivity"
            android:label="@string/app_name" />
        <activity
            android:name=".ShareProductActivity"
            android:label="@string/app_name" />
        <activity
            android:name=".SharePriceActivity"
            android:label="@string/app_name" />
        <activity
            android:name=".ShareStoreActivity"
            android:label="@string/app_name" />
        <activity
            android:name=".ProfileActivity"
            android:label="@string/app_name" />
        <activity
            android:name=".ShowMapActivity"
            android:label="@string/app_name" />
        <activity
            android:name=".ParticularEntryActivity"
            android:label="@string/app_name" />
        <activity
            android:name=".MyLocationActivity"
            android:label="@string/app_name" />
        <activity
            android:name=".MapMarkerActivity"
            android:label="@string/app_name" />
        <activity
            android:name=".BarcodeActivity"
            android:label="@string/app_name" />
        <activity
            android:name=".BarcodeResult"
            android:label="@string/app_name" />
        <activity
            android:name=".FeedbackActivity"
            android:label="@string/app_name" />
        <activity
            android:name=".SplashActivity"
            android:label="@string/app_name" />
        <activity
            android:name=".Example"
            android:label="@string/app_name" />

        <uses-library android:name="com.google.android.maps" />
    </application>

</manifest>

1
可能是库类没有被正确引用。 - Andro Selva
2
@Archie.bpgc,请完整编写清单文件,以便理解每一行代码。 - Lalit Poptani
1
从您的异常中,您的类是哪一个 - Facebook 还是 Example,因为您在清单文件中声明为 com.android.myapp 的包中,但是对于 Facebook 活动,您声明为 com.android.myapp.Facebook.Example - Praveenkumar
示例是我在com.Android.myApp.Facebook包中的活动。 - Housefly
1
如果Example是您的Activity名称,那么您应该将您的Activity声明为com.android.myapp.Facebook.Example,因为这个Activity来自不同的包或者将您的Activity命名为Facebook.Example。我说得对吗? - Praveenkumar
显示剩余4条评论
9个回答

42

你在清单文件中声明的包名为 com.Android.myApp,活动名称为 .Example。所以 Android 将从 com.Android.myApp.Example 中搜索它。 但是你的活动驻留在 "com.Android.myApp/com.Android.myApp.Facebook.Example" 中。因此,请将活动名称设置为 .Facebook.Example 或按照下面给出的完整路径进行设置。

<activity
                android:name="com.Android.myApp.Facebook.Example">

</activity>

标签<activity>的属性名称包含无效字符'/'。 - Housefly
1
关键是要记得在声明Activity时,在完整包名之前加上点“.”。很容易忘记这个点,而且Android Studio有时会建议(自动完成)不带点!当缺少这个点时,你会意外地得到这个错误。 - Mr-IDE

6
我遇到了这个问题的一个变化。 我在启动一个名为“设置”(Settings)的活动时,也遇到了相同的错误,而且对清单文件进行所有建议的更改都无法解决问题。
问题在于,在调用活动中,我还使用/导入了android.provider.Settings,因此从我所看到的尝试启动活动时,它在两者之间搞混了。 因此,我在代码中而不是在清单文件中进行了更改以包括完整路径:
Intent launchScr = new Intent(this, com.foo.bar.Settings.class);

这样做是有效的。当然,解决这个特定问题的另一种更好的方法是使用更好的活动名称。

希望这对遇到这个问题变体的人有所帮助。


在我的情况下,我将Activity的拼写写错了。 - Sagar Devanga
1
我有一个PreferencesActivity,似乎有一个同名的Android类,其中有一个include语句。原因相似。 - Dave Hubbard

6

您也可以使用

<activity
        android:name=".Facebook.Example"
        android:label="@string/app_name" />

4
有时候,这是因为存在不同包中相同的类名(即Intent的第二个参数)。
我还发现,当你调用startService而不是调用startActivity,或者反过来时,也会出现这种情况。

2

当缓存清单不同步时,这可能会在大型项目上发生。我能够在Android Studio终端中使用./gradlew clean修复它,然后在Android Studio菜单栏中选择文件> 无效缓存/重启以确保有效。


2

你的异常信息中,哪一个类是你的类——Facebook还是Example?因为你在清单文件中声明的包名是com.Android.myApp,但是对于facebook活动,你声明了com.android.myApp.Facebook.Example

如果Example是你的活动,那么你应该将你的活动声明为com.Android.myApp.Facebook.Example,因为它来自不同的包,或者将你的活动名称设置为Facebook.Example。所以最好像下面这样声明你的活动:

<activity
        android:name="com.Android.myApp.Facebook.Example"
        android:label="@string/app_name" />

1

请确保您的Activity已经添加了这个属性:

[Activity(Label = "Your App Name", MainLauncher=true)]

注意:只有在需要时才设置MainLauncher。

0
如果您想要动态地从字符串更改类,您需要使用以下代码: Intent intent = new Intent().setClassName(this.getPackageName(), "com.some.other.name"); 或者您可以将数组或任何其他结果放入“com.some.other.name”的位置。祝好运!

0

如果您有一个Activity对象(需要启动),则可以使用此方法:

 intent.setClassName(CallingActivity.this, activityToLaunch.getComponentName().getClassName());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接