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

时间:2011-11-18 09:20:45

标签: android intellij-idea android-intent intentfilter

我有一个启动活动,可以启动这样的另一个活动

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构造函数的字符串参数。相应的类与像

这样的splash字符串配对
   <?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>

这可以完美地工作直到我重命名包名。我使用重构重命名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中第二个活动的Filter中吗?!

11 个答案:

答案 0 :(得分:35)

这是Android Studio中的一个错误。解决它:

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

答案 1 :(得分:31)

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

如果他们能够在这个令人敬畏的IDE中解决这个问题会很好,因为这些错误很难被追踪(这个错误需要4个月才能实现错误)。

答案 2 :(得分: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>

答案 3 :(得分:4)

在我的情况下,我按照这里的所有答案,但我也必须清理缓存。我按照这个步骤:

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

答案 4 :(得分:2)

File -> Invalidate caches/Restart可能会修复此类错误

答案 5 :(得分:0)

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

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

<activity android:name=".SplashActivity"

对此:

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

有同样的问题。在尝试了这个主题中的所有内容之后,它变成了Android Studio的即时运行。

禁用此功能可以立即修复问题,同时删除.android / build-cache下的所有内容(如果可以找到特定版本的话)。原因是即时运行似乎使用了应用程序的缓存版本,在常规清理/重建期间甚至无法删除。

答案 8 :(得分:0)

我也有这个问题,特别是切换口味时。所以解决它的是在Android中禁用Instant Run。 我想就此提出一些重要观点 -

  • 确保您的清单正常。
  • 清理项目并重建项目的最长时间将解决问题。
  • 在2.1以上的Android工作室中禁用即时运行。
  • 卸载应用并重新安装。

答案 9 :(得分:0)

确保Gradle,Manifest中的包名称相同。 转到模块设置 - &gt;味道 - &gt;应用程序ID - &gt; (您的包裹名称)

答案 10 :(得分:0)

重命名程序包后,我也遇到以下错误:

启动器活动com.path1.abc/com.path2.abc.SplashActivity执行 不存在。

我确保软件包名称已更新,并且还包含这些文件

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

最后卸载了先前的应用程序,清理并运行该项目。那对我有用。