3

私は現在、asmacklibを使用してXMPPサーバーに接続するアプリケーションに取り組んでいます。このアプリケーションには、基本的にメッセージの送受信、ステータスの変更などが含まれます。

現時点では、XMPP接続はアプリケーション内に存在し、ある種のバックグラウンドサービスには含まれていません。だから今私は疑問に思っています、サービスを使用して接続を維持するか、アプリケーションが実際に実行されているときに接続を維持する方が良いですか?

これは、アプリケーションがバックグラウンドで実行されているとき、およびユーザーがXMPP接続のあるアクティビティに戻ったときに、XMPPサーバーに接続したままにしておきたいことを考慮しています。メインアクティビティ(クレデンシャルで接続している場所)に関しては、同じクレデンシャルでXMPP接続を再接続する場合はこのようにしました。しかし、連絡先ビューにしばらく滞在すると、そのアクティビティが接続時に差し押さえに戻った場合(つまり、nullポインタ例外)、しばらくすると接続が閉じられるという問題に直面しています。ここでは、再接続することはできません。繋がり。

ある意味で、アクティビティがフォアグラウンド/開始されたらすぐに(再)接続/ログインする方がよいのか、それともサービス内で一度接続してこの接続を維持する方がよいのかを尋ねています。

サービスの作成がより良い方法である場合、フラグメントからの作成方法とXMPP接続の作成方法、およびボタンを使用してログインとログアウトを行う必要があります。これらのオプションをサービスで維持する方法。

前もって感謝します、

4

1 に答える 1

6

常にXMPPサーバーに接続したい場合は、これが最適Serviceな方法です。

したがって、ユーザーがログインすると、通信を開始して実行を継続でき、ユーザーがログアウトしたら、通信serviceを停止できます。service

serviceクリックするとアクティビティを開く通知を表示できます。

サービスとアクティビティの間に単純な通信(たとえば、いくつかのコマンドを渡す)がある場合は、を使用してこれを行うことができますLocalBroadcastManagerが、通信がより複雑な場合(たとえば、アクティビティがサービスのイベントをリッスンする)は、service binderから使用されるを作成することを検討してください。activity

これは、サポートするサービスのスケルトンの例です。bind

public class MyService extends Service {
    private final IBinder binder = new ServiceBinder();

   @Override
   public int onStartCommand(Intent intent, int flags, int startId) {
      onHandleIntent(intent);
      return START_STICKY;
   }

   protected void onHandleIntent(Intent intent) {
       // handle intents passed using startService()
   }

   @Override
   public IBinder onBind(Intent intent) {
    return binder;
   }

   public class ServiceBinder extends Binder {
        MyService getService() {
            return MyService.this;
        }
    }
}
于 2013-02-11T07:22:30.063 に答える