Не удалось создать экземпляр получателя java.lang.ClassNotFoundException

Я получил ошибку в своем приложении для Android, когда оно пытается создать экземпляр приемника, который я использую для запуска службы при загрузке. Ошибка очевидна, не может найти файл класса моего ресивера. Но все в порядке с моим файлом манифеста, пакетами и всем остальным, и я понятия не имею, что происходит. Вот мой код:

package dti.obd.reader;

import dti.obd.reader.service.MainService;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class BootReceiver extends BroadcastReceiver 
{
      @Override
      public void onReceive(Context context, Intent intent) 
      {
            Intent serviceIntent = new Intent(MainService.class.getName());
            context.startService(serviceIntent);
      }
}

И мой файл манифеста:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="dti.obd.reader"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />


    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >

        <service android:name=".service.MainService" >
            <intent-filter >
                <action android:name="dti.obd.reader.service.MainService" />
            </intent-filter>
        </service>

        <receiver android:name="dti.obd.reader.BootReceiver" >
            <intent-filter >
                <action android:name="android.intent.action.BOOT_COMPLETED" >
                </action>
            </intent-filter>
        </receiver>
    </application>

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

</manifest>

Кто-нибудь знает ошибку? Вроде с пакетом и названиями все в порядке...


person Guilherme Gusman    schedule 07.03.2012    source источник


Ответы (4)


Вы должны вложить свой Receiver в какой-нибудь package. Система не сможет создать его экземпляр, если он находится в основном пакете.

У меня такая же проблема. К счастью, прежде чем искать ошибку в Интернете, я делал другой проект Java. Я только что понял, что ошибка там была похожа на эту. Я попробовал это только сейчас и работал. :)

person Yashar PourMohammad    schedule 23.08.2012
comment
Можете ли вы объяснить это немного больше? - person levi; 07.08.2014

Я тоже столкнулся с этой проблемой. Добавление полного имени пакета в определение приемника в файле манифеста не помогло. Проблема заключалась в том, что был старый файл odex, соответствующий моему файлу apk. Система Android загружает классы из файла odex, поэтому не может найти класс получателя.

Обходные пути:

  • Удалите старый файл odex или
  • Дайте новое имя вашему apk

http://www.addictivetips.com/mobile/what-is-odex-and-deodex-in-android-complete-guide/

person Gökçer Gökdal    schedule 27.01.2015
comment
Я столкнулся с той же проблемой. В предыдущей версии я использовал имя приемника A. В текущей версии я удалил его, а затем получил эту ошибку. - person Jonguo; 12.03.2015
comment
У нас есть это исключение в нашем приложении онлайн. И оказывается, что эти решения могут быть обходными. - person Cobain; 04.07.2017
comment
какое новое имя для вашего apk? серьезно, вы предлагаете нам опубликовать новое приложение :D - person Emil; 30.05.2019
comment
@batmaci Я имею в виду, переименуйте имя вашего артефакта (имя файла apk), нет необходимости переименовывать имя вашего пакета. Таким образом, вы можете опубликовать одно и то же приложение. Google play ищет только имена пакетов приложений, а не имена файлов apk, как вы знаете;) - person Gökçer Gökdal; 31.05.2019

пытаться:

<receiver android:name=".BootReceiver" >

Он добавляет само имя пакета, потому что вы определили:

package="dti.obd.reader"
person Caner    schedule 07.03.2012
comment
Я уже пробовал этот способ. Вот почему я изменился, чтобы снова указать пакет ... но ни один из них не работает. Спасибо за вашу помощь! - person Guilherme Gusman; 07.03.2012
comment
Вам нужно указать пакет AND write receiver line таким образом. Вы оба одновременно? Также загляните на coderanch.com/t /439875/Android/Mobile/ возможно, вы заметите что-то другое. (Вряд ли это имеет значение), но поместите строку user-permission над строкой application. - person Caner; 07.03.2012
comment
Я пробовал все, но ничего не работает. Я схожу с ума от этой ошибки. Я думаю, это что-то с названием пакета, какое-то ограничение, которого я не знаю... - person Guilherme Gusman; 07.03.2012
comment
Это также кажется неправильным: ‹service android:name=.service.MainService › ‹intent-filter › ‹action android:name=dti.obd.reader.service.MainService /› ‹/intent-filter› ‹/service› - person Caner; 07.03.2012
comment
Я понял. Это как-то связано с моей виртуальной машиной. Я создал новый и он заработал. Также я внес эти изменения, которые вы мне сказали, и я думаю, что это очень помогло, потому что мой файл манифеста был довольно грязным. Спасибо - person Guilherme Gusman; 07.03.2012

Вы должны поместить свой Получатель в какой-либо пакет. Вместо этого добавьте полный путь к Получателю.

 <receiver android:name="com.yourpackage.BootReceiver" >

Звучит странно, но в моем случае это решило проблему.

Надеюсь, кто-то будет плодотворным с этим опытом

person Abhishek Chaubey    schedule 13.04.2017