【问题标题】:BroadcastReceiver as inner classBroadcastReceiver 作为内部类
【发布时间】:2011-06-18 19:05:24
【问题描述】:

我知道 BroadcastReceiver 如果定义为 Activity 的内部类,则不能使用。但我想知道为什么?是因为系统必须实例化一个大的Activity 对象才能实例化一个接收器实例吗?

【问题讨论】:

    标签: android broadcastreceiver inner-classes


    【解决方案1】:

    ...因为系统必须实例化一个大型 Activity 对象才能实例化一个接收器实例?

    是的,就像任何其他非静态内部类一样。在创建(非静态)内部类的实例之前,它必须从某处(例如通过实例化或通过其他机制)获取外部类的实例。

    从系统自动实例化的清单文件中的意图调用的全局广播接收器没有此类外部实例可用于创建广播​​接收器非静态内部类的实例。这与外部类是什么无关,Activity 与否。

    但是,如果您将接收器用作处理活动的一部分,则可以在活动中自己手动实例化广播接收器(在活动回调之一中,您可以使用外部类的实例: 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);
        }
        ...
    }
    

    【讨论】:

    • 我已尝试按照您的建议使用内部类(以及我在网上的一些示例中看到的):gist.github.com/daviddoria/80c9c5dc98913b54bf00 但是当我旋转设备时不会调用 onReceive。有什么建议吗?
    • bert 持有外部类对象会导致内存泄漏吗??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多