目前我正面临着一个我不知道如何解决的问题。基本上我的应用程序连接到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,我可以上传代码但我老实说认为问题出在服务的某个地方。
答案 0 :(得分:0)
我找到了解决方案,虽然忘了关闭案例。提供的代码按预期工作,我只是错过了正在发生的异常,它使服务重新启动,从而失去了连接。