2010-11-24 2 views
4

Я разрабатываю приложение на Android и имею проблему, когда платформа Android бросает java.lang.InstantiationException при попытке создать экземпляр вложенного класса. Вот сценарий.Невозможно создать экземпляр вложенного класса (расширяет broadcastReceiver) при отправке sendBroadcast

  1. Класс расширения с вложенными активность класса B, который простирается BroadcastReceiver:

    public class A extends Activity 
    { 
        public void onCreate(){ 
        ....}; 
        //Class B 
        public class B extends BroadcastReceiver 
        { 
         public void onReceive(...) 
        } 
    } 
    
  2. объявления классов в файле манифеста: ....

Извините за плохой отступ. Просто не удалось найти способ правильно отпечатать код с таким количеством тегов.

  1. Broadcast от службы:

    Intent updateIntent = new Intent(); 
    updateIntent.setAction("desired_action"); 
    sendBroadcast(accountPropertyUpdateIntent); 

Со всеми вышеприведенными вещей, код компилируется, но при запуске на устройстве, после трансляции называется, я получаю InstantiationException говоря не может создать pacakage.A $ B, а dalvik говорит, что не найдено.

Теперь весь этот сценарий работает на Android 2.2, но как-то это выходит из строя 2.1.

Я не знаю точно, что происходит. Мне нужна помощь. Возможно, что-то основное не хватает мне.

Может ли кто-нибудь мне помочь? Заранее спасибо.

+0

Я уверен, что вы не можете иметь вложенный класс вещания. Почему вы пытаетесь это сделать? – Falmarri 2010-11-24 16:40:35

+0

Нужна трансляция вещания внутри класса А, чтобы в каком-то широковещательном событии класс B мог напрямую обращаться к членам класса А и соответствующим образом обновлять интерфейс. – Puneet 2010-11-25 03:11:03

ответ

4

Наконец-то я получил логический вывод обо всем сценарии. Было достаточно глупо не читать документацию <receiver> на developer.android.net. В нем четко сказано, что есть два способа для приложения получить трансляцию.

There are two ways to make a broadcast receiver known to the system: 
One is declare it in the manifest file with this element. 
The other is to create the receiver dynamically in code and register it with the 
Context.registerReceiver() method. 
See the BroadcastReceiver class description for more on dynamically created receivers. 

Я использую оба метода. Мой сценарий также должен был провалиться и на 2.2, так как эти приемники были зарегистрированы через манифест, и их нужно было вызвать автоматически, но почему-то это не было (это все еще остается загадкой).

Удалены все приемники из манифеста и просто сохраняются динамическая регистрация широковещательных приемников, и теперь код работает так же, как и раньше, только без исключений.

Спасибо за помощь. :)

1

Nested class documentation говорит (последний абзац):

To instantiate an inner class, you must first instantiate the outer class. 
Then, create the inner object within the outer object with this syntax: 

OuterClass.InnerClass innerObject = outerObject.new InnerClass(); 

Так Android не может создать экземпляр внутреннего класса автоматически. Просто переместите класс B на верхний уровень (в отдельный файл B.java).

Смежные вопросы