Переименование пакета и ошибка "Класс действия не существует"

У меня есть активность всплеска, которая запускает другое действие, подобное этому

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();
    }

Чтобы начать другое действие, я использую параметр string для конструктора 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.

Похоже, приложение пытается запустить действие Splash с использованием пути OLDpath/NEWpath.Splash, и там есть ошибка, но я не могу найти, почему он использует такой путь.

Я использую IntelliJ IDE. Есть идеи? Может ли это быть в Фильтре во 2-й активности в манифесте?!

Ответ 1

Ошибка была в IntelliJ IDEA в конце концов. Когда вы создаете проект, Configuration автоматически запускает функцию запуска и печатает имя класса по умолчанию. Когда вы меняете имя пакета, рефакторинг не изменяет строку конфигурации, которая все еще указывает на старое имя класса. Вот почему не была ошибка времени компиляции, но ошибка времени выполнения.

Было бы здорово, если бы они смогли исправить эту проблему в этой удивительной среде IDE, так как эти ошибки очень трудно отследить (на это потребовалось 4 месяца, чтобы понять, где была ошибка).

Ответ 2

Это ошибка в Android Studio. Чтобы исправить это:

  • Закрыть Studio.
  • Удалить .idea/workspace.xml
  • Студия запуска.

Ответ 3

Вы заметили эту разницу (для имени пакета в манифесте),

Запуск операции com.path1.pathOLD/com.path1.path2.SplashActivity.

Измените пакет в файле манифеста.. используйте этот измененный манифест и дайте мне знать, что произойдет.

EDIT: измененный файл манифеста,

<?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>

Ответ 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

Ответ 5

У меня было такое же сообщение об ошибке в Eclipse/ADT (обычно, когда два человека работают над одним и тем же проектом с использованием разных IDE) и фиксировали его с помощью добавления имени пакета в начало имени действия (и всех других действий, получателей, служб и т.д.) в AndroidManifest.xml.

В этом примере это означало бы изменение этого:

<activity android:name=".SplashActivity"

Для этого:

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

Ответ 6

У меня была эта проблема, и это было из-за проблемы в файле манифеста. Убедитесь, что файл манифеста не имеет проблем.

Ответ 7

Была та же проблема. После попытки всего в этом потоке он оказался мгновенным запуском Android Studio.

Отключение этого исправляет проблему сразу же, как и удаление всего содержимого в .android/build-cache (конкретной сборки, если вы можете ее найти). Причина заключается в том, что в мгновенном прогоне используется кэшированная версия приложения, которая даже не удаляется во время обычной очистки/восстановления.

Ответ 8

У меня также была эта проблема и, в частности, при переключении ароматов. Так что для меня это решило отключить Instant Run в android. Я хотел бы включить некоторые важные моменты в этом вопросе -

  • Убедитесь, что ваш манифест в порядке.
  • Максимальное время очистки проекта и его восстановление решают проблему.
  • Отключить мгновенный запуск в студии Android версии 2.1.
  • Удалите приложение и переустановите его.

Ответ 9

Убедитесь, что имя пакета совпадает с именем Gradle, манифест. Перейдите в Настройки модуля → Ароматизаторы → Идентификатор приложения → (название вашего пакета)

Ответ 10

File → Invalidate caches/Restart может исправить этот тип ошибок