アプリケーションでモーションセンサー検出を使用しています。
私の設計は次のとおりです。クラスはメイン アクティビティからセンサー サービスの参照を取得し、 SensorEventListener を実装します。つまり、MainActivity はセンサー イベントの変更をリッスンしません。
public void onCreate(Bundle savedInstanceState) {
// ... code
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
// The following is my java class, it does not extends any android fragment/activty
mShakeUtil = new ShakeUtil(mSensorManager,mAccelerometer,this);
// ..more code..
}
ShakeUtil を再設計することはできないため、残念ながらフラグメントでもアクティビティでもありません。問題を説明するために、次のことを考慮してください。
- MainActivity は、破棄/一時停止中です。つまり、画面の回転
- ShakeUtil の onSensorChanged(SensorEvent event) がプロセスで呼び出されます。
onSensorChanged 内で発生することの 1 つはダイアログ インタラクションで、エラーが発生します。
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
MainActivity の onSaveInstanceState と onPause の間で前のことが発生した場合。ShakeUtil で MainActivity が一時停止していることを正常に検出できれば、これを防ぐことができることがわかっています。
MainActivity が一時停止されていること、または onSaveInstanceState が ShakeUtil から呼び出されたことを検出するにはどうすればよいですか?
または、Shakeutil の拡張アクティビティを行わずにこの問題を回避するにはどうすればよいですか?
これまでフラグ変数を試してきましたが、それだけでは十分ではありません。これらはアトミック操作ではないと思います。アクティビティの isChangingConfigurations() を使用してみましたが、文書化されていない「NoSuchMethodFound」エラーが発生します。メインのアクティビティで onPause のときに ShakeUtil を呼び出して、センサーの登録を解除しています。