1

スマートフォンが逆さまの場合、センサー イベント リスナーから子アクティビティを開始しようとしています。私が書いた最初のコードは次のようになりました:

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 デバイスがアクティビティを 1 回ではなく約 3 回開始するという問題があります。これは、 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){
            // ...
        }
    }

}

-AtomicBoolean の使用:

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
                }
            }
        }
    }

}

そのアプローチはどれもうまくいかなかったので、なぜこれが起こるのか、どうすればそれを変更して機能させることができるのだろうか?

前もって感謝します!

4

1 に答える 1

0

Androidマニフェストファイルで属性をアクティビティに設定しますandroid:launchMode="singleTask"

<activity
            android:name=".CategoryActivity"
            android:launchMode="singleTask"
            android:screenOrientation="portrait" >
        </activity>

これで問題が解決するかどうかはよくわかりませんが、実際には、センサーがsignleTaskにあるためアクティビティを再度開始すると、再起動せず、アクティビティの現在の状態が持続します。

于 2012-11-20T06:55:42.120 に答える