Использование широковещательного приемника в качестве внутреннего класса активности с регистрацией манифеста

У меня есть деятельность, в которой у меня есть широковещательный приемник (br). Если я регистрирую br программно, приемник регистрируется и отлично работает.

Однако, если я зарегистрирую получателя в манифесте, я получу исключение java.lang.ClassNotFoundException.

<receiver             
        android:name=".MyActivity.UpdateUIClass"
        android:exported="false"
        >
        <intent-filter>
            <action android:name="com.mydomain.main.FILTER_UPDATE_UI" />
            <category android:name="android.intent.category.DEFAULT" />                
        </intent-filter>
    </receiver>

пожалуйста, порекомендуйте


person Roy Hinkley    schedule 21.09.2012    source источник


Ответы (1)


Если UpdateUIClass является внутренним классом MyActivity, вам нужно обращаться к нему таким образом android:name=".MyActivity$UpdateUIClass"

Именно так вы делаете это в макете XML. Не уверен, что это сработает для манифеста, но попробуйте и посмотрите, сработает ли это.

Изменить

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

Связанный вопрос: Можно ли определить широковещательный приемник как внутренний класс в файле манифеста?

person Michael Celey    schedule 21.09.2012
comment
Ну, теперь он это видит (не получайте исключение класса, не найденного), но теперь я получаю Невозможно создать экземпляр получателя... нет пустого конструктора - добавил один и все равно получаю ошибку. - person Roy Hinkley; 21.09.2012
comment
Убедитесь, что внутренний класс и конструктор являются общедоступными. - person Michael Celey; 21.09.2012
comment
Любопытно, почему программная регистрация отличается от манифестной. Вещи распределяются по-другому? - person Roy Hinkley; 21.09.2012
comment
Только что попробовал статический - не работает. Тогда ни один из моих методов недоступен. Я выберу статус-кво и зарегистрирую их с помощью кода, но предпочел бы сделать это через манифест — меньше хозяйственных операций. - person Roy Hinkley; 21.09.2012
comment
Извините за статический комментарий, я отредактировал комментарий сразу после публикации, потому что это была плохая идея. Проверьте, до чего был обновлен комментарий. - person Michael Celey; 21.09.2012
comment
Да, оба являются публичными - всегда были. - person Roy Hinkley; 21.09.2012
comment
Тогда мне придется вернуться к моему предложению сделать класс статическим или разделить его на другой файл. Недостатком этого, как вы видели, является то, что он больше не может получить доступ к классу Activity таким же образом, поэтому вам придется внести некоторые более крупные изменения в код. Единственная причина, по которой я могу понять, почему он не может создать экземпляр получателя, заключается в том, что ему нужна ссылка на внешний класс, чтобы получить доступ к внутреннему классу. Сделав класс получателя статическим или разбив его на отдельный файл, вы устраните это ограничение. Причина, по которой проще использовать код, заключается в том, что вы сами создаете ссылку. - person Michael Celey; 21.09.2012
comment
Спасибо за предложение, но, как было сказано ранее, я зарегистрируюсь с кодом. Рефакторинг всего, что будет затронуто, не вариант. Очень хотелось бы узнать, баг это или что. Я просто хочу понять, что здесь происходит. - person Roy Hinkley; 21.09.2012
comment
Это не ошибка, просто Java обращается с доступом к внутренним классам. Если вы не можете создать экземпляр внешнего класса, вы не сможете получить доступ к зависимому внутреннему классу. Причина, по которой вы можете сделать это в коде, заключается в том, что вы создаете экземпляр внутреннего класса внутри внешнего класса. У вас уже есть экземпляр класса, который система не может создать самостоятельно. - person Michael Celey; 21.09.2012
comment
Спасибо за пояснение - теперь понятно. Я предполагаю, что сортировка класса из манифеста происходит, когда apk загружается, а не по требованию. Для полноты действие объявляется в манифесте над объявлением получателя. - person Roy Hinkley; 21.09.2012