应用程序结束时,服务端的Android XMMP连接结束

时间:2014-10-15 20:34:15

标签: android service connection xmpp

目前我正面临着一个我不知道如何解决的问题。基本上我的应用程序连接到XMPP聊天,并在朋友的状态发生变化时不断通知用户。一切都按预期工作。今天我进入下一步,即使应用程序被销毁,也不断向用户发送推送通知。我已设法在应用程序结束后继续运行服务,但由于某种原因,当应用程序终止时,与我的XMPP聊天的连接结束。我不明白为什么,我真的会给予一些帮助。这是我的服务代码:

    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:我正在使用 a Smack,我可以上传代码但我老实说认为问题出在服务的某个地方。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案,虽然忘了关闭案例。提供的代码按预期工作,我只是错过了正在发生的异常,它使服务重新启动,从而失去了连接。