1

受信場所の更新を公開するなど、いくつかの目的で接続を維持するアプリケーションに取り組んでいます。Androidのやり方と他の回答からのアドバイスに従って、画面の回転時にアプリケーションを破棄して再作成するデフォルトのAndroidの動作をオーバーライドしていません。その点ではうまく機能します。

onRetainNonConfigurationInstance メソッドで接続を保持します。問題は、ユーザーがホームを押したとき、アプリケーションが最小化されたとき、または何らかの理由でフォーカスを失ったときに接続を閉じたいのですが、画面が回転したときではないため、onPause、onStop、または OnDestroy なしではこれを行うことができません。構成の変更時に次々に呼び出されるため、いくつかのチェック。現時点では、isFinishing() を使用してアプリケーションが閉じられているかどうかを確認していますが、ユーザーが Home を押した場合は、isFinishing() == true (これは理にかなっています) は必要ありません。

私が考えた1つの解決策は、アプリケーションが接続の更新を処理するスレッドにフォーカスを持っているかどうかを確認し、フォーカスがない時間が経過した場合は単純に閉じることですが、これを行うためのより良い方法が必要だと思いますか?

お時間をいただきありがとうございます。

(投稿された回答を読んだ後、アクティビティのライフサイクルとonRetainNonConfigurationInstanceに関して物事を明確にするために編集されました)

4

3 に答える 3

1

私はついに、Activity でフック メソッド onUserLeaveHint() を見つけました。これは、少なくともこれまでに見たケースで必要なことを行います。つまり、構成の変更により再起動中は接続が開いたままになりますが、ユーザーがホームまたは戻るを押すと接続が閉じられます。したがって、私が最終的に得た解決策は、以下のコードのようなものです。質問に関係のないものはすべて削除され、名前は簡略化されています。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (m_connection == null) {
        Connection connection = (Connection) getLastNonConfigurationInstance(); // Try to get a saved version of the connection
        if (connection != null) {
            m_connection = connection;
        }
        else {
            m_connection = new Connection(); // Else create a new one
        }
    }
}

@Override
protected void onStart() {
    super.onStart();
    // The activity is about to become visible, connect.
    if (!m_connection.isConnected())
        m_connection.connect();
}

@Override
protected void onResume() {
    super.onResume();
    // The activity has become visible (it is now "resumed").
    m_bUserLeaving = false;
}

@Override
protected void onStop() {
    super.onStop();
    // The activity is no longer visible (it is now "stopped").
    if (m_bUserLeaving && m_connection.isConnected()){ // Disconnect if we stopped because the user left
        m_connection.disconnect();
    }
}

@Override
protected void onDestroy() {
    super.onDestroy();
    if (isFinishing() && m_connection.isConnected()) { // Often means that the user pressed back
        m_connection.disconnect();
    }
}

@Override
public Object onRetainNonConfigurationInstance() {
    // If we get the chance, keep our connection for later use
    return m_connection;
}

@Override
protected void onUserLeaveHint() {
    m_bUserLeaving = true;
}
于 2011-07-13T14:36:00.090 に答える
0

私によると、デバイスのローテーションを処理し、ローテーションが完了した後に維持したいすべての値/アクションを保持する必要があります。
ホームボタンを押すとonPause()、ネットワークアクティビティを停止しonResume()て再起動するために使用します

于 2011-07-12T10:14:05.647 に答える
0

この投稿を確認して、アクティビティのライフサイクルとそのコールバックについて理解を深めてください。複雑なメカニズムを実装したり、HOME ボタンのクリックをオーバーライドしたりする必要はありません。onPause() または onStop() アクティビティ コールバックでアプリケーションを閉じるときに実行するすべてのコードを単純に投稿する必要があります。上記のリンクで見つけることができるものとの違い。お役に立てれば。

于 2011-07-12T10:15:58.733 に答える