2012-03-07 21 views
8

Wystąpił błąd w mojej aplikacji systemu Android, gdy próbuję utworzyć instancję odbiornika, którego używam do uruchamiania usługi przy starcie systemu. Błąd jest oczywisty, nie może znaleźć pliku klasy mojego odbiornika. Ale wszystko jest w porządku z moim plikiem manifestu, pakietami i wszystkim i nie mam pojęcia, co się dzieje. Tu jest mój kodu:Nie można utworzyć instancji odbiornika java.lang.ClassNotFoundException

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

A mój plik manifestu:

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

Czy ktoś zna erro? Wydaje się, że opakowanie i nazwy są ok ...

Odpowiedz

16

Trzeba umieścić Reciever w niektórych package. System nie będzie mógł wykonać instancji, jeśli znajduje się na głównym pakiecie.

Miałem ten sam problem. Na szczęście przed przeszukaniem błędu w Internecie robiłem kolejny projekt java. Właśnie zdałem sobie sprawę, że ten błąd był podobny do tego. Wypróbowałem to teraz i pracowałem. :)

+0

dziękuję! działało dobrze, to ans powinno być akceptowane! +1 dla ciebie –

+7

Czy możesz wyjaśnić to nieco więcej? – levi

1

try:

<receiver android:name=".BootReceiver" > 

Dodaje ona sama nazwa pakietu, ponieważ zdefiniowane:

package="dti.obd.reader" 
+0

Ja już próbował w ten sposób. To dlatego zmieniłem, aby ponownie podkreślić pakiet ... ale żaden z nich nie działa. Dzięki za pomoc! –

+1

Musisz określić pakiet 'AND' wpisz w ten sposób' receiver' line. Czy oboje w tym samym czasie? Spójrz również na http://www.coderanch.com/t/439875/Android/Mobile/make-your-application-run- może zauważysz coś innego. (Jest mało prawdopodobne, aby to miało jakikolwiek wpływ), ale umieść linię 'user-permission' powyżej linii' application'. – Caner

+0

Próbowałem wszystkiego, ale nic nie działa. Szaleję na punkcie tego błędu. Myślę, że to coś z nazwą pakietu, pewne ograniczenia, których nie znam ... –

1

Mam również do czynienia z tym problemem. Dodanie pełnej nazwy pakietu do definicji odbiorcy w pliku manifestu nie pomogło. Problem polegał na tym, że był stary plik odex odpowiadający mojemu plikowi apk. System Android ładuje klasy z pliku odex, więc nie może znaleźć klasy odbiornika.

Obejścia:

  • Usuń stary plik ODEX lub
  • nadać nową nazwę apk

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

+1

Zmierzyłem się z tym samym problemem. poprzednia wersja, używam nazwy odbiornika A, W obecnej wersji usunąłem ją, a następnie dostaję ten błąd – Jonguo

+0

Mamy ten wyjątek w naszej aplikacji online i okazuje się, że te rozwiązania mogą obejść się. – Cobain

0

Trzeba umieścić odbiornik w jakimś pakiecie Zamiast tego dodaj pełną ścieżkę do Odbierz r

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

Brzmi weired ale w moim przypadku jest rozwiązany

nadzieję, że ktoś będzie owocne z tego doświadczenia

Powiązane problemy