promixitylistner甚至在unregistring之后工作

时间:2013-05-29 13:56:04

标签: service wakelock proximitysensor

我正在开发一个应用程序,它可以关闭和打开基于接近传感器的屏幕。我写的代码成功地关闭了屏幕。

这是接近传感器注册和未注册的活动

MainActivity.java

public class MainActivity extends Activity {

    public String TAG = "MainActivity";

    BackgroundService mService;
    boolean mBound = false;
    boolean firstTime = true;
    Intent BackgroundIntent ;
    private ServiceConnection mConnection = new ServiceConnection() {
            @Override
            public void onServiceDisconnected(ComponentName arg0) {
                // TODO Auto-generated method stub
                Log.w(TAG, "Service Disconeted");
            mBound = false;
            mService = null;
        }

            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                // TODO Auto-generated method stub
                LocalBinder binder = (LocalBinder)service;
                mService = binder.getService();
                mBound=true;
                if(firstTime){
                    MainActivity.this.onStart();
            }
                firstTime = false;
                Log.w(TAG, "Service Connectedd");
            }
        };


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.w(TAG, "onCreate()");
        setContentView(R.layout.activity_main);
        Button buttonStart = (Button)findViewById(R.id.button1);
        Button buttonStop = (Button)findViewById(R.id.button2);
        buttonStart.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                mService.enableSensor();
                Log.w(TAG, "ButtonStart Clicked");
            }
        });

    buttonStop.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            if(mBound){
                mService.disableSensor();

            }

            Log.w(TAG, "ButtonSTOP Clicked");
        }
    });


    startService(new Intent(this,BackgroundService.class));        

}

@Override
 public void onStart(){
        super.onStart();
        Log.w(TAG, "onStart Method");
        Intent intent = new Intent(getApplicationContext(),BackgroundService.class);
        getApplicationContext().bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
   }

@Override    
protected void onStop(){
        super.onStop();
        if(mBound){
            getApplicationContext().unbindService(mConnection);
            Log.w(TAG, "Unbinding the service");

        }
        Log.w(TAG, "onStop Method");
    } 

}

这是一个具有SensorEventListner的服务,它可以监听接近传感器中的变化

BackgroundService.java

public class BackgroundService extends Service{

    public String TAG = "BackgroundService";
    private final IBinder mBinder = new LocalBinder();
    private SensorManager mSensorManager ;
    private Sensor mProximitySensor ;
    private SensorEventListener mSenosorEventListener;
    private PowerManager.WakeLock proximityWakeLock;
    public float maxSensorValue;


@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    Log.e(TAG, "Binding with backgroundService");
    return mBinder;
}

public class LocalBinder extends Binder{
     BackgroundService getService(){

         return BackgroundService.this;
     }
}

@Override
public void onCreate(){

    Log.w(TAG, "BackgroundService Created");

    proximityWakeLock = ((PowerManager)getSystemService("power")).newWakeLock(32, "");
    proximityWakeLock.setReferenceCounted(false);
    mSensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
    mProximitySensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
    maxSensorValue = mProximitySensor.getMaximumRange();

    mSenosorEventListener = new SensorEventListener() {


        @Override
        public void onSensorChanged(SensorEvent event) {
            // TODO Auto-generated method stub
            if(event.sensor.getType() == Sensor.TYPE_PROXIMITY  ){

                    if(event.values[0] == maxSensorValue)
                    {
                        Log.w(TAG, "Object moved ****AWAY*****");
                        screanTurnOn();
                    }
                    else{

                        Log.w(TAG, "Object moved ****NEAR******");
                        screanTurnOFF();
                    }

            }
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
            // TODO Auto-generated method stub
            Toast.makeText(getApplicationContext(), "Sensor Accuracy Changed", Toast.LENGTH_SHORT).show();
        }
    };

}



@Override
public void onDestroy(){

    mSensorManager.unregisterListener(mSenosorEventListener);
    Log.w(TAG, "BackgroundService is Destroyed");
       super.onDestroy();

}


public void screanTurnOFF(){


    if(proximityWakeLock.isHeld()){
        this.proximityWakeLock.release();
        Log.e(TAG,"WakeLock is released");
    }
}
public void screanTurnOn(){
    if(!proximityWakeLock.isHeld())
        proximityWakeLock.acquire();

    while(proximityWakeLock.isHeld()){
        Log.e(TAG, "WakeLock is acurqerd");
        return;
    }
}

public void enableSensor(){
    if(mProximitySensor == null){

        Log.w(TAG, "No Proximity detector found");

    }else{

        mSensorManager.registerListener(mSenosorEventListener, mProximitySensor,SensorManager.SENSOR_DELAY_NORMAL);
        Log.w(TAG, "Proximity detector Enabled : "+ mProximitySensor.getName());
    }
}

public void disableSensor(){
    mSensorManager.unregisterListener(mSenosorEventListener,mProximitySensor);
    Log.w(TAG, "Proximity Detector Disabled : " + EnableProximitySensor);
}

}

我有两个按钮,一个用于将SensorEventListner注册到传感器管理器,另一个用于取消注册。第一个按钮完美运行。当我点击第二个按钮时,ProximityEventListen仍然未注册.SenseoEventLister仍然有效,但应用程序不会显示来自BackGroundService的任何日志消息。

如果我注释掉 screenTurnON() screenTurnOFF()函数,代码就可以正常工作。 请帮帮我

0 个答案:

没有答案
相关问题