1

我有一个活动,它有两个广播接收器来获取电池寿命和 GPS 位置。根据开发人员指南,我在 onResume() 中注册了它们,并在 onPause() 中取消了注册。但是接收器中的 onReceive() 方法被无限调用。这是我的代码:

    public class BatteryStatusReceiver extends BroadcastReceiver {

        private final static String TAG = "BatteryStatusReceiver";

        private Activity mActivity = null;

        public BatteryStatusReceiver(Activity activity){
            this.mActivity = activity;
        }

        @Override
        public void onReceive(Context context, Intent intent) {

            String action = intent.getAction();
            if (Log.isLoggable(TAG, Log.DEBUG))
                Log.d(TAG, "action:" + action);

            int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
            int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);

            //This will calll mActivity.onNewIntent method.
            if (mActivity!=null){
                Intent i = new Intent(context, mActivity.getClass());
                i.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
                i.putExtra(BatteryManager.EXTRA_LEVEL, level);
                i.putExtra(BatteryManager.EXTRA_SCALE, scale);
                context.startActivity(i);
            }
        }

    }

    public class LocationReceiver extends BroadcastReceiver {

        private Activity mActivity;

        public LocationReceiver(Activity activity) {
            this.mActivity = activity;
        }

        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(LocationService.ACTION_GPS_ACTIVATED)){
                double[] location = intent.getExtras().getDoubleArray(ConstDef.KEY_LOCATION); //lat, lng

                //This will calll mActivity.onNewIntent method.
                if (mActivity!=null){
                    Intent i = new Intent(context, mActivity.getClass());
                    i.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
                    i.putExtra(ConstDef.KEY_LOCATION, location);
                    context.startActivity(i);
                }
            }
        }


    }

    //LocationService
    public class LocationService extends Service implements LocationListener {

    /* (non-Javadoc)
     * @see android.app.Service#onStartCommand(android.content.Intent, int, int)
     */
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        String action = intent.getAction();
        if (action.equals(ACTION_START))
            processStart(ONE_MINUTE*10, 100);
        else if (action.equals(ACTION_STOP))
            processStop();
        return START_NOT_STICKY;
    }

        /* (non-Javadoc)
     * @see android.location.LocationListener#onLocationChanged(android.location.Location)
     */
    @Override
    public void onLocationChanged(Location location) {
        Log.d(TAG, "onLocationChanged");

        if (isBetterLocaion(location, mCurrentBestLocation)) 
            mCurrentBestLocation = location;

        broadcastLocation(mCurrentBestLocation);
    }

        /**
     * Send location to the receivers 
     * @param location
     */
    protected void broadcastLocation(Location location){
        Intent intent = new Intent(ACTION_GPS_ACTIVATED);
        intent.putExtra(ConstDef.KEY_LOCATION, new double[]{location.getLatitude(), location.getLongitude()});
        sendBroadcast(intent);
    }
}

    //Activity
         private BatteryStatusReceiver mBatteryReceiver = new BatteryStatusReceiver(this);

        @Override
        protected void onResume() {
            super.onResume();
            //Activate location service to get the response from GPS as soon as possible before calling.
            startService(new Intent(LocationService.ACTION_START));

            IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
            registerReceiver(mBatteryReceiver, ifilter);
        }

        @Override
        protected void onNewIntent(Intent intent) {
            int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
            int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);

            float batteryFull = level / (float)scale;
            //if (Log.isLoggable(TAG, Log.DEBUG))
            Log.d(TAG, "Level:" + level + " Scale:" + scale + ", batteryFull:" + batteryFull);

            String dateTime = JDateUtils.now(JDateUtils.LONG_DATE_FORMAT);

            //TODO. Process here...
        }       

        @Override
        protected void onPause() {
            super.onPause();

            stopService(new Intent(this, LocationService.class));
            unregisterReceiver(mBatteryReceiver);
        }   
}

我的代码中缺少什么?请帮我解决我的问题。提前致谢。

4

0 回答 0