web-dev-qa-db-ja.com

パッケージの名前変更とエラー「アクティビティクラスが存在しません」

このような別のアクティビティを開始するスプラッシュアクティビティがあります

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パスを使用してスプラッシュアクティビティを開始しようとしているようですが、エラーが発生していますが、そのようなパスを使用している理由がわかりません。

IntelliJ IDEを使用しています。何か案は?マニフェストの2番目のアクティビティのフィルターに含まれている可能性がありますか?

24
sandalone

エラーはIntelliJにありましたIDEA結局のところ、プロジェクトを作成すると、構成は起動機能を自動的にチェックし、デフォルトクラスの名前を出力します。パッケージの名前を変更しても、リファクタリングは変更されません古いクラス名をまだ指す構成文字列コンパイル時エラーではなく実行時エラーがあったのはそのためです。

これらの種類のエラーを追跡するのは非常に難しいため、この素晴らしいIDE=でこの問題を修正できると便利です(エラーがどこにあるかを理解するのに4か月かかりました)。

31
sandalone

これはAndroid Studioのバグです。修正するには:

  1. スタジオを閉じます。
  2. .idea/workspace.xmlを削除します
  3. Studioを起動します。
38
sasha_trn

私の場合、私はここからすべての答えに従いましたが、キャッシュを消去する必要もありました。私はこの手順に従いました:

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
Jorge Casariego

この違いに気づきましたか(マニフェストのパッケージ名の場合)

起動アクティビティは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>
4
user370305

File -> Invalidate caches/Restartこのタイプのエラーを修正する場合があります

3
ArjunA

マニフェストのGradleでパッケージ名が同じであることを確認してください。モジュール設定->フレーバー->アプリケーションID->(パッケージ名)に移動します。

0
Cloy

私もこの問題、特にフレーバーを切り替えるときに問題がありました。だから私のためにそれを解決したのは、Androidでインスタントランを無効にすることです。これに関するいくつかの重要なポイントを含めたいと思います

  • マニフェストに問題がないことを確認してください。
  • プロジェクトをクリーンアップして再構築する最大回数は問題を解決します。
  • Androidスタジオでのインスタントランを無効にします。
  • アプリをアンインストールして再インストールします。
0
Arpan Sharma

同じ問題がありました。このスレッドですべてを試した後、Android Studioのインスタント実行であることがわかりました。

これを無効にするとすぐに問題が修正され、.Android/build-cache(特定のビルドが見つかった場合はそれ)の下のすべてが削除されます。その理由は、インスタントランがキャッシュされたバージョンのアプリを使用しているように見えるためです。これは、通常のクリーンアップ/再構築中にも削除されません。

0
tom808

私はこの問題を抱えていましたが、それはマニフェストファイルの問題が原因でした。マニフェストファイルに問題がないことを確認してください。

0
Hesam

Eclipse/ADTで同じエラーメッセージが表示されました(通常、2人が異なるIDEを使用して同じプロジェクトで作業している場合)パッケージ名をアクティビティ名(およびその他すべてのアクティビティ、レシーバ、サービスなど)AndroidManifest.xml

この例では、これはこれを変更することを意味します:

<activity Android:name=".SplashActivity"

これに:

<activity Android:name="com.path1.path2.SplashActivity"
0
Josh