2

私のアプリには、常に実行したいローカル サービスがあります。これは、サービスに別のスレッドを開始させ、そのHandler. サービスにバインドすると、バックグラウンド スレッドのハンドラーが返されるため、クライアント アクティビティは要求を発行できます。

ここまでは順調ですね。

私のアプリはFragment、初期状態を設定するために、サービスを使用する必要がある s を使用します。ユーザー入力に応じてフラグメントがインスタンス化されると、それは問題ありません。その時点までに、サービスはフラグメントの親アクティビティにバインドされているからです。つまり、ServiceConnection.onServiceConnectedはフレームワークによって呼び出され、アクティビティHandlerはそのフラグメントがサービスとの通信に使用できる を認識しています。

問題は、向きの変更に応じてアクティビティが再インスタンス化されたときに始まります。スタック トレースを読むと、この状況では、フレームワークが呼び出される前に ServiceConnection.onServiceConnectedメイン スレッドのメッセージ ループを介して同じパスですべてのアクティビティ フラグメントを再作成するため、再作成フェーズでサービスにアクセスできないようです。

私が見つけた唯一の解決策は、サービスがバックグラウンド スレッドに関連付けられた Handler をアプリケーション グローバル状態に公開することです。(他にもテクニックはありますが、私はその目的のためにサブクラス化Applicationしています。) 結局、私はその「サービス性」ではなく「スレッド性」を使用しています。

これは、Android がぎこちなく複雑にしたいと考えていることを行うための、シンプルで効果的な方法のようです。グローバル状態に関する通常の一般的な留保とは別に、私のアプローチが見落としている Android 固有の考慮事項はありますか? または、同じ目的を達成するためのより良い方法はありますか?

4

2 に答える 2

1

私の理解が正しければ、IntentServiceを調べることに興味があるかもしれません。IntentService は、バインド時に独自の Thread を開始する Service であり、受信した Intent を処理します。もう調べましたか?

于 2013-07-01T13:45:58.663 に答える