Bluetooth接続を持つアプリを作成しています。接続が失われたり、失敗したり、確立されたりするたびにコールバックを使用するライブラリを作成しました。接続に関してはすべて問題なく動作しますが、向きの変更を処理するのに苦労しています。デバイスの向きが変わっても接続を開いたままにしたい。同時に、ユーザーがアプリケーションを閉じたときに接続を閉じる必要があります。私がこれを設計している API レベルは、API 5 ~ 10 です。私が遭遇する問題は次のとおりです。
で接続を
onDestroy()
閉じると、アプリが閉じられるたびに接続が閉じられますが、アプリが単に一時停止されたときではありません(目的の出力)。ただし、onDestroy()
アプリケーションの向きが変わるたびに呼び出されます。これは問題#2につながります。を使用する
onRetainNonConfigurationInstance()
と、開いたソケットを正常に維持できます。でソケットを閉じないとonDestroy()
、すべて正常に動作します。ただし、アプリを閉じてもソケットは開いたままのようです (つまり、他のデバイスはまだソケットから読み取っています)。
現在のセットアップは次のようになります。
BluetoothConnection btConnection;
@Override
public void onCreate(Bundle icicle)
{
/** Activity setup **/
btConnection = (BluetoothConnection) getLastNonConfigurationInstance();
if(btConnection != null) // we already have a connection from a previous state, let's set it up to work with this state
{
/** Set up the connection since it already exists **/
}
}
@Override
public Object onRetainNonConfigurationInstance()
{
BluetoothConnection saveConnection = btConnection;
return saveConnection;
}
@Override
protected void onDestroy()
{
super.onDestroy()
if(btConnection != null)
btConnection.closeConnection();
}
この現在の実装では、ソケットは保存されますが、同時に閉じられ、because both onRetainNonConfigurationInstance()
が呼び出されますonDestroy()
。
私は2つのことを知りたいと思います:
onRetainNonConfigrationInstance()
そもそもこの問題を処理する良い方法はありますか?- アプリが閉じるまで接続を開いたままにしておくよりエレガントな方法はありますか? 物事が閉じないようにするために onRetainCalled のようなブール値を作成することを考えましたが、それは私には醜いようです(そしておそらく信頼できないでしょう)。