2011-10-05 10 views
12

私はXMPP経由でプッシュ通知を受け取るアプリケーションを開発しています(C2DMは知っていますが、いくつかの制限があり、そのために使用できません)。いくつかの時間の後にガベージコレクトされ、Androidデバイスにプッシュ通知を送ることはできません。AndroidでXMPP接続(asmackを使用)を維持する

私はAndroidサービスを実装する必要があると思いますが、接続を維持するサービスを実装する方法はわかりません。 誰かが私を助けることができましたか?

答えて

20

「ガベージコレクション」が正しい用語であるかどうかはわかりません。アクティビティで接続を作成するので、あなたのアクティビティは単にAndroidによって閉じられる可能性が高くなります。

しかし、あなたは正しいです。安定した接続を維持するには、XMPP接続をServiceに入れる必要があります。しかし、サービス自体が余分なプロセスやスレッドではないので、接続が余分なスレッドにあることを確認してください。これは、例えばHandlerで行うことができます。

HandlerThread thread = new HandlerThread(SERVICE_THREAD_NAME); 
thread.start(); 
handlerThreadId = thread.getId(); 
serviceLooper = thread.getLooper(); 
serviceHandler = new ServiceHandler(serviceLooper); 

次に、あなたのメッセージ/テントを経由してサービススレッドと通信することができます。もう1つの選択肢は、Binderインターフェイスです。

BeemGTalkSMSはどちらも、AndroidサービスとのXMPP接続を実装するオープンソースプロジェクトです。 GTalkSMSはIntentService approachを使用しますが、BeemはBinderを使用してXmppConnectionと通信します。

GTalkSMSとかなり安定した接続が確立されていますが、GTalkサービス/クライアントの在庫としてはそれほど良いものではありません。 1つの理由は、デフォルトのキープアライブチェックタイマーが5分であることです。これは、できるだけ多くのバッテリーを節約したい場合にモバイルデバイスにとってしばしば使用されます。だから私はそれをより高い価値に設定しなければならなかったが、それにはいくつかの欠点がある。あなたはいつも、速く応答性があり、安定した接続と電池寿命の間にトレードオフがあります。

+1

onCreate()メソッドでServiceHandler、Looper、Handler Threadを使用してSugestionを記述したサービスを作成しました。これで接続は終了し、サービスはまだ実行されています。再度、感謝します。 – danilodeveloper

+0

あなたはあなたのコードを共有するでしょうか@danilodeveloper私はそのような問題に直面しています。私はバックグラウンドでmsgを受け取っていません(チャット活動に参加していない別の活動のようです)。あなたのxmpp接続クラスを共有してください。 –

+0

こんにちは@DevendraSingh、残念ながら私はこの5年前に尋ねました、私はもうコードを持っていません。それについて申し訳ありません:( – danilodeveloper

関連する問題