这个工程包括两个类:

1、SensorActivity.java

2、SensorListenerTest.java

在SensorActivity里面可以不用监听,就可以完成自己想要的动作。

1、SensorActivity.java

代码
package com.sener.listener;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;

public class SensorActivity extends Activity {
/** Called when the activity is first created. */
SensorListenerTest1 sensorListenerTest1;
String TAG
= "SensorActivity";

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

sensorListenerTest1
= new SensorListenerTest1(this);
}

class SensorListenerTest1 extends SensorListenerTest {

public SensorListenerTest1(Context context) {
super(context);
// TODO Auto-generated constructor stub
}

@Override
public void OnEventChangedMethod(int z) {
// TODO Auto-generated method stub
Log.v(TAG, "the value of z >8");
}

}

@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
sensorListenerTest1.enableSensor();
}

@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
sensorListenerTest1.disableSensor();
}
}


2、SensorListenerTest.java

代码
package com.sener.listener;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.util.Log;

public abstract class SensorListenerTest {
private SensorManager mSensorManager;
private Sensor sensor;
private float mLastX, mLastY, mLastZ;
private Context mContext;
SensorEventListenerImpl sEventListenerImpl;

public SensorListenerTest(Context context) {
mContext
= context;
/*
* //在构造函数里面注册Sensor服务,这个也可以不要。 enableSensor();
*/
sEventListenerImpl
= new SensorEventListenerImpl();

}

// 注册传感器服务,在本java和Activity里面都要注册,但是取消注册的时候,只在activity里面取消注册即可。
public void enableSensor() {
// 在这里真正注册Service服务
mSensorManager = (SensorManager) mContext
.getSystemService(Context.SENSOR_SERVICE);
sensor
= mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

if (mSensorManager == null) {
Log.v(
"sensor..", "SensoSensorEventListenerImpl rs not supported");
}

mSensorManager.registerListener(sEventListenerImpl, sensor,
SensorManager.SENSOR_DELAY_NORMAL);

}

// 取消注册传感器服务
public void disableSensor() {
if (mSensorManager != null) {
mSensorManager.unregisterListener(sEventListenerImpl);
mSensorManager
= null;
}
}

class SensorEventListenerImpl implements SensorEventListener {

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub

}

@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
if (event.sensor == null) {
return;
}

if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
mLastX
= event.values[SensorManager.DATA_X];
mLastY
= event.values[SensorManager.DATA_Y];
mLastZ
= event.values[SensorManager.DATA_Z];
String sX
= String.valueOf(mLastX);
String sY
= String.valueOf(mLastY);
String sZ
= String.valueOf(mLastZ);
Log.v(
"sX==", sX);
Log.v(
"sY==", sY);
Log.v(
"sZ==", sZ);
}

if (mLastZ > 8) {
OnEventChangedMethod(
3);
}


}

}

abstract public void OnEventChangedMethod(int z);
}

总结:

1、SensorListenerTest是一个抽象类,有一个抽象方法OnEventChangedMethod();

  哪个类继承了这个抽象类,就可以重写这个抽象方法了,可以完成自己想要这个方法完成的动作。

2、在activity里面注册和取消注册一次Sensor的服务即可。不用注册两次。

3、由于在普通的java类里面要获取SensorManager和Sensor等相关东西,需要有context,所以,在普通java类中,以context作为参数,传全局变量mcontext给context,这样在整个普通java类中,就都可以用mcontext了。

所以也可以把enableSensor里面的获取服务的那两句,加到构造函数中,如下:

代码
public SensorListenerTest(Context context) {
mContext
= context;
/*
* //在构造函数里面注册Sensor服务,这个也可以不要。 enableSensor();
*/
mSensorManager
= (SensorManager) mContext
.getSystemService(Context.SENSOR_SERVICE);
sensor
= mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sEventListenerImpl
= new SensorEventListenerImpl();

}
都是可以运行正确的。因为mcontext是全局变量。

因为SensorListenerTest1继承了SensorListenerTest,所以他们的构造函数是形似的,故想用SensorListenerTest1的话(用其实例,先实例化,如果不实例化,会抛出异常,类对象都要new,不能只声明,如:SensorListenerTest1 st1;而要SensorListenerTest1 st1=new SensorListenerTest1();这样才能用这个类的实例st1 ),实例化这个类的时候,需要传context的参数,

这里传this,

这样就可以用这个类了,这个类继承了SensorListenerTest,所以覆盖了抽象函数,(也就是需要重写抽象函数),重写里面的内容,完成自己想要的功能。

4、SensorActivity想用监听抽象类,必须要用一个子类A继承这个抽象类,A里面包含抽象方法,在SensorActivity里面重写抽象方法即可完成自己想要的功能。

posted on 2010-08-18 17:57  snowdrop  阅读(834)  评论(0)    收藏  举报