问题描述
- 请问大侠,android开发中,摇一摇为什么会执行两次动作?
-
请问各位大侠,为什么摇一摇的时候,如果摇的比较使劲,估计传感器变化超过两次,就会执行两次或多次动作呀~比如出现好几个代码中的activitypackage com.cnlaunch.ui; import android.app.Activity; import android.app.Service; import android.content.Intent; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.os.Vibrator; import android.widget.Toast; //实现SensorEventListener接口 可以实现多个接口,但是只能继承一个类, public class RockActivity extends Activity implements SensorEventListener { private SensorManager mSensorManager; private Vibrator mVibrator; private final int ROCKPOWER = 15;// 这是传感器系数 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 获取传感器管理服务 mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); // 震动服务 mVibrator = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE); // 震动需要mainfest里面注册哦亲 } /* (非 Javadoc) * @see android.app.Activity#onPause() */ // @Override // protected void onPause() { // // TODO 自动生成的方法存根 // super.onPause(); // if (mSensorManager != null) { // mSensorManager.unregisterListener(this); // } // } @Override protected void onResume() { super.onResume(); if (mSensorManager != null) { // 加速度传感器 mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), // 还有SENSOR_DELAY_UI、SENSOR_DELAY_FASTEST、SENSOR_DELAY_GAME等, // 根据不同应用,需要的反应速率不同,具体根据实际情况设定 SensorManager.SENSOR_DELAY_NORMAL); } } @Override protected void onStop() { mSensorManager.unregisterListener(this);// 退出界面后,把传感器释放。 super.onStop(); } @Override public void onSensorChanged(SensorEvent event) { int sensorType = event.sensor.getType(); // values[0]:X轴,values[1]:Y轴,values[2]:Z轴 float[] values = event.values; if (sensorType == Sensor.TYPE_ACCELEROMETER) { if ((Math.abs(values[0]) > ROCKPOWER || Math.abs(values[1]) > ROCKPOWER || Math.abs(values[2]) > ROCKPOWER)) { mVibrator.vibrate(200);// 设置震动 Intent intent=new Intent(RockActivity.this,otherActivity.class); this.startActivity(intent); } } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // TODO Auto-generated method stub } }
解决方案
看你的代码,只要在activity中把另外一个activity的启动模式设置为singleTop就可以了
解决方案二:
activity的启动模式设置为singleTop 这种方式有点取巧了。感觉正规的应该不是这样处理!
解决方案三:
这种建议onSensorChanged内部做一个定时器,比如收到摇动状态后开始计时,5秒内再接收到做为同一次处理。
解决方案四:
看你的代码,只要在activity中把另外一个activity的启动模式设置为singleTop就可以了
解决方案五:
private long lasttime=0;
@Override
public void onSensorChanged(SensorEvent event) {
if (System.currentTimeMillis()>(timeLast+5000)){//5秒 内不在处理
timeLast= System.currentTimeMillis();
int sensorType = event.sensor.getType();
// values[0]:X轴,values[1]:Y轴,values[2]:Z轴
float[] values = event.values;
if (sensorType == Sensor.TYPE_ACCELEROMETER) {
if ((Math.abs(values[0]) > ROCKPOWER || Math.abs(values[1]) > ROCKPOWER || Math.abs(values[2]) > ROCKPOWER)) {
mVibrator.vibrate(200);// 设置震动
Intent intent=new Intent(RockActivity.this,otherActivity.class);
this.startActivity(intent);
}
}
}
}
解决方案六:
传感器 ,activity只算做一次试试
时间: 2025-01-03 07:37:20