【问题标题】:Package rename and error "Activity class does not exist"包重命名和错误“活动类不存在”
【发布时间】:2012-01-01 02:02:31
【问题描述】:

我有一个启动另一个类似这样的活动的启动活动

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash);

        final Thread splashThread = new Thread() {
            @Override
            public void run() {
                try {
                    int wait = 0;
                    while (_isActive && (_splashTime > wait)) { 
                        sleep(100);

                        if (_isActive) {
                            wait += 100;
                        }
                    }
                } catch (InterruptedException e) {
                    Log.d(TAG, e.getMessage());

                } finally {
                    startActivity(new Intent("com.path1.path2.SomeActivity"));
                    finish();
                }
            }
        };
        splashThread.start();
    }

要开始另一个活动,我使用Intent 构造函数的字符串参数。相应的类与这样的启动字符串配对

   <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.path1.path2"
          android:versionCode="2"
          android:versionName="1.0">
    <uses-sdk android:minSdkVersion="4"/>

    <!--permissions-->
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>

    <application android:label="@string/app_name" android:icon="@drawable/icon">
        <activity android:name=".SplashActivity"
                  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=".SomeActivity"
                  android:label="@string/app_name"
                >
            <intent-filter>
                <action android:name="com.path1.path2.SomeActivity"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
        <activity android:name=".OtherActivity" android:label="@string/app_name"
                />

        <!--services-->
        <service android:name=".AlarmService"/>

    </application>
</manifest>

在我重命名包名称之前,这可以完美运行。我通过使用重构重命名清单中的包名称,IDE 相应地重命名所有其他类。但是当我想开始新重命名的项目时,我遇到了一个错误

Launching application: com.path1.pathOLD/com.path1.path2.SplashActivity.
DEVICE SHELL COMMAND: am start -n "com.path1.pathOLD/com.path1.path2.SplashActivity"
Starting: Intent { cmp=com.path1.pathOLD/com.path1.path2.SplashActivity }
Error type 3
Error: Activity class {com.path1.pathOLD/com.path1.path2.SplashActivity} does not exist.

似乎该应用程序尝试使用 OLDpath/NEWpath.Splash 路径启动 Splash 活动并且错误在那里,但我找不到它为什么使用这样的路径。

我使用 IntelliJ IDE。有任何想法吗?会不会在 Manifest 的第二个活动的过滤器中?!

【问题讨论】:

  • 那么,你的问题解决了吗?
  • 请到休闲聊天室,我们可以在那里讨论您的问题。
  • 好的,只需在清单文件中更改包名称,写入“com.path1.pathOLD”并再次运行您的应用程序,让我知道发生了什么......

标签: android intellij-idea android-intent intentfilter


【解决方案1】:

这是 Android Studio 中的一个错误。修复它:

  1. 关闭工作室。
  2. 删除 .idea/workspace.xml
  3. 启动工作室。

【讨论】:

  • 尽管尝试了此线程中的所有其他方法,但在我也这样做之前仍然没有运气。
  • 这解决了 Android Studio 1.0 的问题。谢谢!
  • 在我看来,这个答案比发布为“最佳”的答案要好。就我而言,我也删除了 .idea 的 2 个目录。我不得不关闭 Studio 并导入 Gradle 项目,检测到我所做的许多更改。
  • 这解决了我在 android studio 1.1.0 中重命名包后的问题
  • 试过了,还是不行,我想这解决了一个不同的问题。
【解决方案2】:

这个错误毕竟是在 IntelliJ IDEA 中。创建项目时,配置会自动检查启动功能并打印默认类的名称。当您更改包的名称时,重构不会更改仍然指向旧类名的配置字符串。这就是为什么没有编译时错误,而是运行时错误。

如果他们能在这个很棒的 IDE 中解决这个问题,那就太好了,因为这类错误很难追踪(这个花了 4 个月的时间才意识到错误出在哪里)。

【讨论】:

  • 我认为,Eclipse 在启动应用程序时已内置更新包名称的任务。
  • 这是一个很棒的 IDE 中的一个可怕的错误。我从 Eclipse 转到 IntelliJ 并没有遇到任何问题,直到这个错误袭击了我。感谢您为我们其他人回答您自己的问题。你是一名优秀的社区成员。
  • 非常感谢您回答您自己的问题。我添加了我想首先开始的新活动,但 IntelliJ IDEA 一直说我必须将 添加到旧活动中。解决方案是将单选按钮设置为启动默认活动
  • 很好地找到了解决方案。我在运行>编辑配置的顶部菜单中找到了您在此处显示的屏幕,并且在更改为“启动默认活动”后,项目运行了。
  • 谢谢。 “启动默认活动”选项处于活动状态,似乎在内部找到了错误的活动,所以现在我手动选择了启动活动
【解决方案3】:

File -&gt; Invalidate caches/Restart 可能会修复此类错误

【讨论】:

    【解决方案4】:

    你注意到这个不同了吗(对于清单中的包名),

    启动活动是com.path1.pathOLD/com.path1.path2.SplashActivity.

    在清单文件中更改包..使用这个修改后的清单,让我知道会发生什么..

    编辑:修改清单文件,

    <?xml version="1.0" encoding="utf-8"?>
     <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.path1.path2"
          android:versionCode="2"
          android:versionName="1.0">
    <uses-sdk android:minSdkVersion="4"/>
    
    <!--permissions-->
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    
    <application android:label="@string/app_name" android:icon="@drawable/icon">
        <activity android:name=".SplashActivity"
                  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=".SomeActivity"
                  android:label="@string/app_name"
                >
            <intent-filter>
               <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
        <activity android:name=".OtherActivity" android:label="@string/app_name"
                />
    
        <!--services-->
        <service android:name=".AlarmService"/>
    
    </application>
    

    【讨论】:

    • 啊!!!我们都有答案,但我花了一段时间来描述整个答案,没关系+1。我认为这是唯一的问题。
    • @Lalit Poptani - 我认为,在清单文件有问题,也看看这一行, 这在 .
    • @user370305 我也认为问题出在过滤器上。但是,如果我相应地重命名了两个字符串路径,为什么它不起作用。它通常可以工作,但只有在重命名包名称后才能工作。
    • @user370305 正如我告诉 Lalit 的那样,错误不在活动名称的清单中,这是我的错字。对不起!
    • 请更正您的答案,以免我们混淆其他人。谢谢
    【解决方案5】:

    就我而言,我遵循了这里的所有答案,但我还必须清理缓存。我按照以下步骤操作:

    1. Go to ~/.gradle/ and delete caches folder
       rm -r caches
    2. "Sync project with Gradle files" icon on Android Studio
    3.  Run project
    

    【讨论】:

      【解决方案6】:

      我在 Eclipse/ADT 中遇到了相同的错误消息(通常是当两个人使用不同的 IDE 处理同一个项目时)并通过 将包名称添加到AndroidManifest.xml 中活动名称的开头(以及所有其他活动、接收器、服务等)。

      在这个例子中,这意味着改变这个:

      <activity android:name=".SplashActivity"
      

      到这里:

      <activity android:name="com.path1.path2.SplashActivity"
      

      【讨论】:

        【解决方案7】:

        我遇到了这个问题,这是因为清单文件中的问题。确保您的清单文件没有任何问题。

        【讨论】:

          【解决方案8】:

          遇到了同样的问题。在尝试了该线程中的所有内容后,结果证明是 Android Studio 的即时运行。

          禁用此功能可立即解决问题,删除 .android/build-cache 下的所有内容(如果您能找到它,则属于特定版本)。原因是即时运行似乎使用了应用程序的缓存版本,在常规清理/重建期间甚至都没有删除。

          【讨论】:

            【解决方案9】:

            我也遇到过这个问题,特别是在切换口味时。所以为我解决的问题是在 android 中禁用 Instant Run。 我想包括一些关于此的重要观点-

            • 确保您的清单没问题。
            • 清理项目和重建项目的最大次数将解决问题。
            • 在 2.1 以上的 android studio 中禁用即时运行。
            • 卸载应用并重新安装。

            【讨论】:

              【解决方案10】:

              确保您的包名在 Gradle 、Manifest 中相同。 转到模块设置 -> 风味 -> 应用程序 ID ->(您的包名称)

              【讨论】:

                【解决方案11】:

                我在重命名我的包后也遇到了以下错误:

                启动器活动 com.path1.abc/com.path2.abc.SplashActivity 确实 不存在。

                我确保包名已更新并且还包括这些文件

                • google_services.json
                • AndrodiManifest.xml
                • build.gradle

                终于卸载了之前的应用,清理,运行项目。这对我有用。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2017-08-07
                  • 2014-01-21
                  • 2020-03-06
                  • 1970-01-01
                  • 2013-11-09
                  相关资源
                  最近更新 更多