包重命名和错误“活动类不存在”

Posted

技术标签:

【中文标题】包重命名和错误“活动类不存在”【英文标题】: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”并再次运行您的应用程序,让我知道发生了什么...... 【参考方案1】:

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

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

【讨论】:

尽管尝试了此线程中的所有其他方法,但在我也这样做之前仍然没有运气。 这解决了 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

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

【讨论】:

以上是关于包重命名和错误“活动类不存在”的主要内容,如果未能解决你的问题,请参考以下文章

错误类型 3 - 活动类不存在

使用adb shell启动Android应用程序时出现错误“活动类不存在”

React Native 活动类不存在

react-native deploy to android device error 3 活动类不存在

命名空间错误中不存在类型资源

错误:命名空间中不存在类型或命名空间 UI