如果智能手机颠倒,我正在尝试从传感器事件侦听器启动子活动。我编写的初始代码如下所示:
public class MySensorListener implements SensorEventListener{
boolean mIsStarted = false;
public void start(Context context) {
mIsStarted = false;
SensorManager manager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
manager.registerListener(this, manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
}
public void stop(Context context) {
mIsStarted = false;
SensorManager manager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
manager.unregisterListener(this);
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {}
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
float z = event.values[2];
if (z < -8f) {
if (!mIsStarted) {
mIsStarted = true;
// start child activity
}
} else if (z > -7f) {
if (mIsStarted) {
mIsStarted = false;
// stop child activity
}
}
}
}
}
现在我遇到了一个问题,Android 4设备启动活动大约三次而不是一次。我认为发生这种情况是因为在很短的时间内经常调用onSensorChanged方法。所以我试图同步它:
public class MySensorListener implements SensorEventListener{
// ...
public synchronized void onSensorChanged(SensorEvent event) {
// ...
}
}
这不起作用,所以我尝试了更多方法:
- 同步"this"对象
public class MySensorListener implements SensorEventListener{
// ...
public void onSensorChanged(SensorEvent event) {
synchronized(this){
// ...
}
}
}
-同步 isStarted 变量:
public class MySensorListener implements SensorEventListener{
Boolean mIsStarted = false;
// ...
public void onSensorChanged(SensorEvent event) {
synchronized(mIsStarted){
// ...
}
}
}
-使用原子布尔值:
public class MySensorListener implements SensorEventListener{
public AtomicBoolean mIsStarted = new AtomicBoolean(false);
// ...
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
float z = event.values[2];
if (z < -8f) {
if (mIsStarted.compareAndSet(false, true)) {
// start child activity
}
} else if (z > -7f) {
if (mIsStarted.compareAndSet(true, false)) {
// stop child activity
}
}
}
}
}
这些方法都不起作用,所以我想知道为什么会发生这种情况,以及我如何改变它并使其工作?
提前谢谢你!
Android 清单文件中设置归因于活动android:launchMode="singleTask"
<activity
android:name=".CategoryActivity"
android:launchMode="singleTask"
android:screenOrientation="portrait" >
</activity>
我不太确定这会解决您的问题,但实际上当传感器再次启动您的活动时,因为它在signleTask中,它不会重新启动并且活动当前状态保持不变。