包重命名和错误“活动类不存在”
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 -> 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 - 我认为,在清单文件有问题,也看看这一行, 这在就我而言,我遵循了这里的所有答案,但我还必须清理缓存。我按照以下步骤操作:
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
终于卸载了之前的应用,清理,运行项目。这对我有用。
【讨论】:
以上是关于包重命名和错误“活动类不存在”的主要内容,如果未能解决你的问题,请参考以下文章
使用adb shell启动Android应用程序时出现错误“活动类不存在”