これをいくつかの信号処理に使用しています。画面がオフになり、そのときにディスプレイが回転した場合を除いて、すべて正常に機能します。通常、画面オフはアクティビティ onPause() を生成するだけですが、画面が回転すると onPause()、onStop()、onDestroy()、onCreate()、onStart()、onResume()、onPause() になります。つまり、Android が最初に画面の「回転を解除」しているように見えます。
残念ながら、これにより AudioRecord がクラッシュまたはフリーズするようです。
私がすべてを操作する基本的な方法は、onResume() で新しいスレッドが開始され、これが AudioRecord インスタンスをインスタンス化し、セットアップし、録音を開始してからループに入るということです。
keepProcessing = true;
while (keepProcessing)
// read a block of data and process
UI スレッドの onPause() で keepProcessing (揮発性変数) がクリアされ、ワーカー スレッドが停止するのを待ちます。
if (thread.isAlive()) {
keepProcessing = false;
thread.join();
}
thread = null;
他のスレッドが keepProcessing ループから脱落すると、記録を停止し、AudioRecord リソースを解放し、AudioRecord インスタンスをドロップして終了します。
一般的な開始/停止メカニズムとして、これはすべて正常に機能します。ブレークポイントと adb でチェックすると、すべてが正しい順序で行われているようです。この画面回転シナリオでは機能しません。古いアクティビティですべてが停止した後、非常に高速な新しいアクティビティ onCreate() などが原因だとしか思えません。つまり、まだ使用中の AudioRecord に何かがあります。画面を再びオンにしようとすると、すべてがフリーズします。
実際に録音を開始しないように AudioRecord コードをダミーにすると、ループは停止してスリープ状態になり、再び録音を停止することはありません。すべて問題ありません。レコーダーが録音モードに入ると、問題が発生します。
何かアドバイス?