2014-10-15 4 views
0

현재 해결 방법을 모르는 문제가 있습니다. 기본적으로 내 응용 프로그램은 XMPP 채팅에 연결하고 친구의 상태가 변경되면 사용자에게 계속 알려줍니다. 모든 것이 예상대로 작동합니다. 오늘 나는 응용 프로그램이 파괴 되더라도 사용자에게 푸시 알림을 계속 보내는 다음 단계로 넘어갔습니다. 응용 프로그램이 종료 된 후에도 서비스를 계속 유지할 수 있지만 응용 프로그램이 종료되면 XMPP 채팅 연결이 끊어집니다. 나는 왜 어떤 도움을 정말로 간절히 원할 것입니다. 여기 내 서비스 코드는 다음과 같습니다.Android XMMP 앱 종료시 앱 종료

package ... 

    import ... 

    public class ChatService extends Service { 

     private final IBinder mBinder = new ChatBinder(); 
     public static final String F_TAG = "ChatService"; 
     private Context context; 

     public static LoginCallBack loginCallBack; 
     public static StatusChangedCallBack statusChangedCallBack; 

     private String username; 
     private String server; 
     private String password; 

     public ChatServer getChatServer() { 
      return chatServer; 
     } 

     private ChatServer chatServer; 
     private HashMap<String, ArrayList<Friend>> listDataChild; 
     private ArrayList<String> listDataHeader; 

     @Override 
     public IBinder onBind(Intent intent) { 
      Log.i("S_TAG", "Service Binded"); 
      return mBinder; 
     } 

     @Override 
     public boolean onUnbind(Intent intent) { 
      Log.i("S_TAG", "Service Unbinded"); 
      return super.onUnbind(intent); 
     } 

     @Override 
     public void onCreate() { 
      Log.i("S_TAG", "Service Created"); 
      initListDataHeader(); 
      super.onCreate(); 
     } 

     @Override 
     public void onDestroy() { 
      Log.i("S_TAG", "Service Destroyed"); 
      super.onDestroy(); 
     } 

     @Override 
     public int onStartCommand(Intent intent, int flags, int startId) { 
      SharedPreferences prefs = this.getSharedPreferences(...); 

      username = prefs.getString("username", null); 
      password = prefs.getString("password", null); 
      server = prefs.getString("server", null); 

      if (username != null && password != null & server != null) { 

       Log.i("T_TAG", username + password + server); 

       new Thread(new Runnable() { 
        @Override 
        public void run() { 
         // Connect to the RIOT CHAT XMPP 
         chatServer = new ChatServer(server); 
         chatServer.connect(); 
         chatServer.login(username, password); 

         if (chatServer.isConnected()) { //&& chatServer.isAuthenticated()) { 
          if (chatServer.isAuthenticated()) { 
           loginCallBack.onLogin(chatServer.isAuthenticated()); 

           Roster roster = chatServer.getConnection().getRoster(); 
           roster.addRosterListener(new RosterListener() {...}); 
          } else { 
           // Authentication Error 
           loginCallBack.onError(1); 
          } 
         } else { 
          loginCallBack.onError(0); 
         }  
        } 
       }).start(); 
      } else { 
       loginCallBack.onError(2); 
       stopSelf(); 
      } 
      return Service.START_STICKY; 
     } 

     @Override 
     public void onStart(Intent intent, int startId) { 
      super.onStart(intent, startId); 
      LogPrint.print(context, "Started Service"); 
     } 

     public HashMap<String, ArrayList<Friend>> getListDataChild() { 

      ...  
      return listDataChild; 
     } 

     public ArrayList<String> getListDataHeader() { 
      return listDataHeader; 
     } 

     public void initListDataHeader() { 
      ... 
     } 

     public class ChatBinder extends Binder { 
      public ChatService getService() { 
       return ChatService.this; 
      } 
     } 

     public FriendHolder findFriend(HashMap<String, ArrayList<Friend>> friends, String user) { 
... 
     } 

     private HashMap<String, ArrayList<Friend>> swapFriends(HashMap<String, ArrayList<Friend>> listDataChild, String onlineOrOffline, int positionToRemoveUpdate) {... 
     } 

      private HashMap<String, ArrayList<Friend>> sendPushToActionBar (Presence p, Friend friend, Presence.Type oldPresenceType){... 
     } 

어떤 문제가 발생했는지 알고 싶습니다. 가능하면 올바른 구현 방법과 코드 개선을위한 팁뿐만 아니라 올바른 방향으로 안내하는 팁을 원합니다. 미리 감사드립니다.

EDIT1 : 응용 프로그램이 파괴 된 경우 콜백을 사용하지 않는 부분이 코드에 없습니다 (아무 것도 실행되지 않으면 응용 프로그램에서 업데이트 할 것이 없기 때문에 푸시 알림을 보냅니다). 연결이 왜 끝나는 지 이해하고 싶을뿐입니다.

EDIT2 : Smack으로 코드를 업로드 할 수 있지만 솔직히 문제는 여기 서비스에 있다고 생각합니다.

답변

0

나는 해결책을 발견했다. 그러나 사건을 마무리하는 것을 잊어 버렸다. 제공된 코드가 의도 한대로 작동하고 있습니다. 예외가 누락되어 서비스가 다시 시작되고 연결이 끊어졌습니다.