BroadcastReceiver使用系统注册:在 AndroidManifest.xml 中注册 public void onReceive(Context context, Intent intent) {            
         try {
Thread.sleep(1);
Log.i("mytag", "44444444444");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
中会有ANR错误报出如果使用代码中注册: IntentFilter intentFilter = new IntentFilter( "android.provider.Telephony.SMS_RECEIVED " );
registerReceiver( mBatteryInfoReceiver , intentFilter); 在public void onReceive(Context context, Intent intent) 超时了 就没有ANR错误
这个是为什么?

解决方案 »

  1.   

    Thread.sleep(1);写错了
    是Thread.sleep(10000);
     
      

  2.   

    如果你的registerReceiver 是在UI线程里面注册的,那么onRecive中的操作也会在UI线程中,如下官方API文档所属。public abstract Intent registerReceiver (BroadcastReceiver receiver, IntentFilter filter)
    Since: API Level 1Register a BroadcastReceiver to be run in the main activity thread. The receiver will be called with any broadcast Intent that matches filter, in the main application thread. LZ可以把时间改大一点试试,我自己也测试了下,是要报ANR滴咯
      

  3.   

    Thread.sleep(1);
    这是神马情况,休眠1ms,为嘛?呵呵....
      

  4.   

    只要你掉了sendBroadcast都一样会有的,因为onReceive方法运行于UI主线程中,那个registerReceiver和AndroidManifest系统注册是对等的效果。虽然Service的OnCreate等方法都在后台被单独的线程调用,所以不会阻塞。    private class ServiceRestarter implements Runnable {
            private ServiceRecord mService;        void setService(ServiceRecord service) {
                mService = service;
            }        public void run() {
                synchronized(ActivityManagerService.this) {
                    performServiceRestartLocked(mService);
                }
            }
        }