这个工程包括两个类:
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();
}
因为SensorListenerTest1继承了SensorListenerTest,所以他们的构造函数是形似的,故想用SensorListenerTest1的话(用其实例,先实例化,如果不实例化,会抛出异常,类对象都要new,不能只声明,如:SensorListenerTest1 st1;而要SensorListenerTest1 st1=new SensorListenerTest1();这样才能用这个类的实例st1 ),实例化这个类的时候,需要传context的参数,
这里传this,
这样就可以用这个类了,这个类继承了SensorListenerTest,所以覆盖了抽象函数,(也就是需要重写抽象函数),重写里面的内容,完成自己想要的功能。
4、SensorActivity想用监听抽象类,必须要用一个子类A继承这个抽象类,A里面包含抽象方法,在SensorActivity里面重写抽象方法即可完成自己想要的功能。

浙公网安备 33010602011771号