Приемник как внутренний class в Android

В моем коде есть внутренний class, который расширяет BroadcastReceiver .

И я добавил следующую строку в AndroidManifest.xml :

  

Но я получаю следующую ошибку:

не удалось создать экземпляр получателя org.example.test.OuterClass $ InnerClass

Как я могу решить эту проблему?

Внутренний class (нестатический) не может быть создан Android через AndroidManifest.xml ( документация разработчика Android на BroadcastReceiver ):

Вы можете динамически регистрировать экземпляр этого classа с помощью Context.registerReceiver () или статически публиковать реализацию через тег в вашем AndroidManifest.xml.

Таким образом, вы можете динамически регистрировать приемник. В моем приложении я хотел сделать то же самое для использования Google Cloud-Device Messaging (C2DM), а мой оригинальный AndroidManifest.xml содержит:

             

Я удалил эту секцию приемника и динамически зарегистрировал приемник следующим образом:

 public class AndroidService extends IntentService { ... @Override public int onStartCommand(Intent intent, int flags, int startId) { IntentFilter filter = new IntentFilter(); filter.addAction("com.google.android.c2dm.intent.RECEIVE"); filter.addAction("com.google.android.c2dm.intent.REGISTRATION"); filter.addCategory("com.example.myapp"); this.registerReceiver(new MyC2dmReceiver(), filter, "com.google.android.c2dm.permission.SEND", null); return super.onStartCommand(intent,flags,startId); } public class MyC2dmReceiver extends BroadcastReceiver { ... } } 

Обозначение $ не обозначает внутренний class, а статический вложенный class. Итак, есть теоретически два пути решения этой конкретной проблемы:

  1. Обозначим его как реальный внутренний class, т. OuterClass.InnerClass (не уверен, хотя если Android будет есть, так как создание внутреннего classа довольно сложное, чем просто выполнение Class#newInstance() .

  2. class InnerClass {} class вместо статического вложенного classа, то есть добавьте static в class InnerClass {} . Таким образом, OuterClass$InnerClass должен иметь возможность создать из него новый экземпляр.

Если это не решит проблему, то, судя по всему, Android просто не елит это. Тогда я просто извлечу его в свой собственный автономный class.

Смотрите также:

  • Учебник Java – Вложенные classы
  • Ответьте на пример кода, как создать экземпляр внутреннего или статического вложенного classа с использованием рефлексии (как Android должен делать «под обложками»)

Может быть, что есть только точка и закрывающая цитата? подобно

  

Это то, что сработало для меня:

 public class OuterClass { public static class InnerStaticClass extends BroadcastReceiver { @Override public void onReceive(final Context context, final Intent intent) { final Location location = (Location) intent.getExtras().get(LocationClient.KEY_LOCATION_CHANGED); } } } 

AndroidManifest.xml:

   

вам не нужно использовать $ … Если вы получаете предупреждение для classа, который на самом деле не является внутренним classом, это потому, что вы используете символы верхнего регистра в имени вашего пакета , что не является обычным.

Я также попытался изменить только первую букву имени пакета на нижний регистр, предупреждение и ошибка исчезли.

Я только что встретил ту же проблему.

У меня есть служба для общения со многими действиями, и у меня также есть приемник на моем сервисе как внутренний class. когда получатель получает сообщение, он должен вызвать метод обслуживания. поэтому он продолжается следующим образом:

1. Сервисный код:

 public class XXService extends Service{ // I want the inner receiver call the methd of XXService, // so I have to write this constructor like this. private XXService instance; public XXService(){instance = this;} public XXService getInstance(){ return instance; } public void sayHello(){ } public static class XXReceiver extends BroadcastReceiver{ onReceive(......){ XXService.getInstance.sayHello(); } } } 

2. Зарегистрируйте приемник в manifest.xml:

  
  • String.format () для форматирования double в java
  • как проверить версию jdk, используемую для компиляции файла .class
  • В чем разница между ServletContextHandler.setResourceBase и ResourceHandler.setResourceBase при использовании встроенного контейнера Jetty?
  • добавление ресурсов в intellij для проекта java
  • Почему объект Object.toString () по умолчанию содержит hash-код?
  • Неустранимая ошибка: неверный макет java.lang.String по значению
  • Может ли Android Studio использоваться для запуска стандартных проектов Java?
  • ListView OnItemClickListener не отвечает?
  • Выполнение динамического кода
  • Android: CountDownTimer пропускает последний onTick ()!
  • java.io.StreamCorruptedException: недопустимый заголовок streamа: 54657374
  • Interesting Posts

    как предотвратить блокировку fgets, когда в файловом streamе нет новых данных

    ReadOnlyCollection или IEnumerable для экспонирования коллекций участников?

    Производительность MongoDB по агрегационным запросам

    Рассчитать разницу между двумя датами (количество дней)?

    XPath – получить узел без дочернего элемента определенного типа

    Ширина пикселя текста в UILabel

    Расстояние Левенштейна в T-SQL

    Почему 64-разрядная версия Windows больше, чем 32-разрядная версия?

    QListView / QListWidget с настраиваемыми элементами и пользовательскими виджетами элементов

    Как я могу служить PDF в браузере, не сохраняя файл на стороне сервера?

    Получение «неправильного имени» NoClassDefFoundError при выполнении программы Java из командной строки

    Избавьтесь от предупреждения безопасности Vista

    Ширина CSS / Max-Width на линии Wrap?

    Если USB не указан в BIOS в качестве опции загрузки, означает ли это, что компьютер не может загрузиться с USB?

    захват изображений с помощью средства MediaStore.ACTION_IMAGE_CAPTURE в Android

    Давайте будем гением компьютера.