3

私の根本的な問題は、アプリがバックグラウンドに置かれるか、ローテーションが行われるかを判断する方法を見つけることです。

音楽認識に使用されるオーディオ録音サービスがあります。このサービスの有効期間をインテリジェントに管理して、次のことを達成したいと考えています。

  1. 最終的にデバイスのローテーションになるライフサイクル イベントの間、サービスを実行し続けます。
  2. アプリがバックグラウンドになったらサービスを停止します (マイクを解放するため)。

onConfigurationChanged私のアプリは、プログラムで追加されたフラグメントを含むアクションバー タブを使用しており、フラグメント レイアウトを再拡張する方法がないため、オーバーライドできません。

これらの課題を克服するための良い方法は何ですか? これまでの私の最善の解決策は、サービスのタイマーを更新することですが、代替案を検討したいと思います。音声検索を使用するとマイクの競合が発生することがよくあるため、タイマーは好きではありません。

4

3 に答える 3

3

getChangingConfigurations()またはisChangingConfigurations()で呼び出すことができますonPause()。これにより、方向が変化しているかどうかがわかります。そうでない場合は、おそらくバックグラウンドになります。

また、 をオーバーライドすることもできます。方向の変更がフレームワークによって処理されるようonCongifurationChanged()に呼び出すようにしてください。super.onConfigurationChanged()

于 2012-10-05T01:14:18.330 に答える
3

アプリがバックグラウンドに置かれていることを検出するには、アクティビティで次のコードを使用できます。

public void onWindowFocusChanged(boolean hasFocus) {

    super.onWindowFocusChanged(hasFocus);

    if (hasFocus)
Toast.makeText(this, "ON TOP", Toast.LENGTH_SHORT).show();
    if (!hasFocus) {
Toast.makeText(this, "ON BACK", Toast.LENGTH_SHORT).show();

         }
    }
于 2012-10-06T06:59:58.957 に答える
0

onConfigurationChanged をオーバーライドできない理由について混乱しています。フラグメント レイアウトを作成したのと同じ方法で再膨張できないのはなぜですか。

バインドされたサービスでは、アクティブなアプリ/アクティビティがバインドされているかどうかに基づいて、システムがサービスの実行/終了を制御するべきではありませんか? アプリケーション コンテキスト (方向の変更後も持続) またはアクティビティ コンテキスト (一時的) に基づいてサービスにバインドしていますか? コードでそれを切り替えてみて、求めている動作が得られるかどうかを確認してください。

編集: onStartCommand/stopServicebindService のハイブリッド ソリューションが必要な場合があります。開始されたサービスは、アクティビティのライフサイクルを超えて永続化できるように見えますが、バインドされたアクティビティから次のバインドされたアクティビティに (onBind/onRebind を介して) 状態データを渡すこともできます。そのデータがフラグメントに役立つかどうかはわかりませんが、少なくとも、これが「新鮮な」アクティビティと「リサイクルされた」アクティビティのどちらであるかを示すフラグを渡すことができます。

私自身はまだサービスを使用していませんが、バインドされたサービスのライフサイクルを詳しく調べると役立つかもしれません。

于 2012-10-05T01:31:18.040 に答える