バックグラウンドで Xmpp サーバーにアクセスするプロジェクトを開始しています。接続を維持し、必要に応じて再接続します + 他の Xmpp 処理を行います。
仕事をするためのクラスを実装したい。Services
クラスは、他の( Location
...) およびBroadcastReceivers
(CONNECTIVITY_CHANGE ....)と対話する必要があります。基本的に、アクティビティとブロードキャスト レシーバーは、Xmpp クラスに、接続、切断、再接続、チャットへの参加、メッセージの送信などのアクションの開始を要求します。
最初のアプローチは、として実装することですService
が、サービスはメインスレッドで実行されるため、実装は間違っています。
第二に、非同期で実行され、メインスレッドから外れているIntentService
ため、それを として作成したかったのです。onHandleIntent
ただし、onHandleIntent
非同期タスクを実行するために一度だけ実行されます。そのため、別の「アクション」を実行したい場合はActivity
、ブロードキャスト イベントしか送信できず、再びメイン スレッドの問題に陥ります。また、IntentService
常に「ライブ」であることを実際に目指しているわけではありません。
AsyncTask
Google のドキュメントでは、ネットワーク アクセスごとに実行する必要があると書かれています...これがネットワーク アクセスを行う唯一の方法ですか...これはかなり悲しいことです。
GTalkSMS の実装を調べたところ、同じ問題があるようでした。実際、彼らは次のような管理で を使用しService
ています。ServiceHandler
// some stuff for the async service implementation - borrowed heavily from // the standard IntentService, but that class doesn't offer fine enough // control for "foreground" services. private static volatile Looper sServiceLooper; private static volatile ServiceHandler sServiceHandler; private final class ServiceHandler extends Handler { public ServiceHandler(Looper looper) { super(looper); } @Override public void handleMessage(Message msg) { onHandleIntent((Intent) msg.obj, msg.arg1); } }