一般情况下Broadcast Receiver都是在onResume的时候注册,在onPause的时候注销。如果想要在程序转到后台运行时(此时Activity已经onStop)监听系统广播,如网络连接状态,应该怎么办?现在遇到的问题是,只要在后台运行时遇到监听的广播,很容易出现ANR。大家知道该怎么办吗?还是不应该在这个时候进行监听?又或者应该换一种处理方法?请大家指导一下,谢谢Broadcast ReceiverANR

解决方案 »

  1.   

    一般可以在onDestroy()里注销广播,或者使用service,ANR估计不是接收广播的事情 ,应该是接收到之后对UI线程的操作时间过长
      

  2.   

    你说的ANR 应该不是有注册或者注销 broadcast receiver 而是由于 坚挺后的动作吧
      

  3.   

    注册广播的方式有两种,你可以使用第二种,即在AndroidManifest.xml中注册<receiver android:name=".ServiceBroadcastReceiver" >
                  <intent-filter>
                      <action android:name="android.intent.action.BOOT_COMPLETED"/>
                  </intent-filter>
            </receiver>然后实现ServiceBroadcastReceiver,收到该广播,做你想做的事情。这个是在整个程序的生命周期均存在,你程序退出了都可以继续接收的
      

  4.   


    谢谢你的答复。但是我发现我现在监听WifiManager.NETWORK_STATE_CHANGED_ACTION这个广播,在我的Activity每次onResume的时候都会收到一次,就算这个时候并没有发生网络状态改变的事情,这是怎么回事啊?而且我是希望在程序不同阶段对这个广播的处理是不一样的,因为有时候是我的程序会主动改变WIFI连接。
      

  5.   


    是的。收到那个广播后,就弹出个AlertDialog,由于这个时候在后台运行,所有就没有对AlertDialog做处理,就出现ANR了。
      

  6.   


    谢谢你的答复。但是我发现我现在监听WifiManager.NETWORK_STATE_CHANGED_ACTION这个广播,在我的Activity每次onResume的时候都会收到一次,就算这个时候并没有发生网络状态改变的事情,这是怎么回事啊?而且我是希望在程序不同阶段对这个广播的处理是不一样的,因为有时候是我的程序会主动改变WIFI连接。
    那你需要检查下你的onCreate onStart onResume中有没有对wifi进行操作
      

  7.   


    谢谢你的答复。但是我发现我现在监听WifiManager.NETWORK_STATE_CHANGED_ACTION这个广播,在我的Activity每次onResume的时候都会收到一次,就算这个时候并没有发生网络状态改变的事情,这是怎么回事啊?而且我是希望在程序不同阶段对这个广播的处理是不一样的,因为有时候是我的程序会主动改变WIFI连接。
    那你需要检查下你的onCreate onStart onResume中有没有对wifi进行操作
    WifiManager.getConnectionInfo()算不算?不然就没了