BroadcastReceiver как внутренний class
Я знаю, что BroadcastReceiver
нельзя использовать, если он определен как внутренний class Activity. Но мне интересно, почему? Это потому, что система должна была бы создать экземпляр большого объекта Activity
чтобы просто создать экземпляр экземпляра приемника?
- нестатический class не может ссылаться на статический контекст
- Почему у нас нет статического метода в (нестационарном) внутреннем classе?
- Использование внутреннего classа
- Использование внутренних classов в C #
- Возможно ли сделать анонимные внутренние classы в Java static?
- внутренний class внутри интерфейса
- Java: нестатические вложенные classы и instance.super ()
- Java: статический и внутренний class
… потому что система должна была бы создать экземпляр большого объекта Activity только для того, чтобы инсталлировать экземпляр получателя?
Да, как и любой другой нестатический внутренний class. Он должен получить экземпляр внешнего classа где-нибудь (например, путем создания экземпляра или каким-либо другим механизмом), прежде чем он сможет создать экземпляры (нестатического) внутреннего classа.
Глобальные широковещательные приемники, которые вызываются из намерений в файле манифеста, которые будут автоматически создаваться системой, не имеют такого внешнего экземпляра, чтобы использовать для создания экземпляра нестатического внутреннего classа вещательного приемника. Это не зависит от внешнего classа, активности или нет.
Однако, если вы используете приемник как часть работы с активностью, вы можете вручную создать экземпляр широковещательного приемника самостоятельно (в то время как один из обратных вызовов активности, у вас есть экземпляр внешнего classа для работы с: this
) и затем зарегистрируйте / отмените регистрацию по мере необходимости:
public class MyActivity extends Activity { private BroadcastReceiver myBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(...) { ... } }); ... public void onResume() { super.onResume(); .... registerReceiver(myBroadcastReceiver, intentFilter); } public void onPause() { super.onPause(); ... unregisterReceiver(myBroadcastReceiver); } ... }