Окружающая среда: Для бесперебойной доставки сообщений от устройств «один-к-одному»/«один-ко-многим» у меня есть служба XMPPService, работающая в фоновом режиме как служба STICKY. Чтобы получать сообщения, у меня есть PacketListener, который срабатывает всякий раз, когда пакет поступает на устройство. Я использую библиотеку asmack для реализации на стороне клиента и OpenFire как мой сервер XMPP.Не удается поддерживать постоянное соединение XMPP с липким сервисом android
public class XMPPService extends Service implements INetworkReceiver {
private XMPPConnection mXmppConnection;
private XMPPMethods xmpp;
private DatabaseHandler db;
private UserDetails user;
private SmackAndroid smack;
private Registrations registrations;
private static final String TAG="XMPPService";
@Override
public IBinder onBind(final Intent intent) {
return new LocalBinder<XMPPService>(this);
}
@Override
public void onCreate() {
super.onCreate();
registrations=new Registrations(getApplicationContext());
xmpp=XMPPMethodsImpl.getInstance(getApplicationContext());
db=DatabaseHandler.getInstance(getApplicationContext());
if(db!=null){
user=db.getUserDetails();
}
createConnection();
}
public void createConnection()
{
ConnectionConfiguration connConfig = new ConnectionConfiguration(
AppConstants.HOST, AppConstants.PORT);
connConfig.setSASLAuthenticationEnabled(false);
connConfig.setDebuggerEnabled(true);
connConfig.setReconnectionAllowed(true);
connConfig.setSecurityMode(SecurityMode.disabled);
mXmppConnection = new XMPPConnection(connConfig);
Thread thread=new Thread(new Runnable() {
private Handler handler=new Handler();
@Override
public void run() {
try {
if(mXmppConnection!=null && !mXmppConnection.isConnected()){
mXmppConnection.connect();
Log.i("XMPPServiceAsync",
"Connected to " + mXmppConnection.getHost());
xmpp.setConnection(mXmppConnection);
}
} catch (XMPPException e) {
e.printStackTrace();
}
//mXmppConnection.addConnectionListener(new XmppConnectionListener());
handler.post(new Runnable() {
@Override
public void run() {
try {
if(db!=null && user!=null && mXmppConnection!=null && !mXmppConnection.isAuthenticated()){
if(user.getUserName()!=null && !user.getUserName().isEmpty()){
mXmppConnection.login(user.getUserName(), "[email protected]!");
xmpp.setPresence(2, mXmppConnection);
xmpp.setConnection(mXmppConnection);
Log.i("XMPPServiceAsync",
"Logged in as " + mXmppConnection.getUser());
}
}
}catch (IllegalStateException e) {
e.printStackTrace();
} catch (XMPPException ex) {
ex.printStackTrace();
}
if(mXmppConnection.isConnected()){
xmpp.rejoinGroups();
registrations.registerMessageListener(mXmppConnection);
registrations.registerPacketListener(mXmppConnection);
registrations.registerMultiUserInvitationListener(mXmppConnection, db, user);
registrations.registerPingListener(mXmppConnection);
}
}
});
}
});
if (thread.getState() == Thread.State.NEW)
{
Log.i(TAG,"Thread State: "+ thread.getState()+"");
thread.start();
}
}
@Override
public int onStartCommand(final Intent intent, final int flags,
final int startId) {
//rejoining rooms
try{
Log.v("XMPP Connection before rejoining",mXmppConnection+"");
if(mXmppConnection.isConnected()){
registrations.registerMessageListener(mXmppConnection);
registrations.registerPacketListener(mXmppConnection);
registrations.registerMultiUserInvitationListener(mXmppConnection, db, user);
registrations.registerPingListener(mXmppConnection);
}
}catch(Exception e){
e.printStackTrace();
}
return Service.START_STICKY;
}
@Override
public boolean onUnbind(final Intent intent) {
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public void reEstablishConnection() {
createConnection();
}
}
Проблема: Когда устройство не используется в течение некоторого времени, отключает устройство от сервера XMPP и подключение идет нуль, которое противоречит спецификации протокола XMPP, который гласит, что сервер XMPP поддерживает постоянное соединение с устройствами до тех пор, пока мы не выйдем из строя. Причина соединения, идущая null, неизвестна. Когда соединение становится нулевым, PacketListener перестает работать.
Что все, что я пробовал:
- Реализовано липкий сервис для подключения к серверу и инициализации слушателей.
- Реализован AlarmManager, чтобы проверить, работает ли служба в фоновом режиме. Он также проверяет, жива ли соединение и периодически проверяется подлинность. (Батарея отвода)
- Реализованный менеджер Ping в соответствии со спецификацией XMPP XEP-0199.
Может кто-то посмотреть на это.
Вы можете решить проблему, у меня такая же проблема – kondal
еще нет. можете ли вы точно объяснить, что вы испытываете? – subhendupsingh
В том же выпуске я зарегистрировал прослушиватель пакетов в сервисе, не прослушивая через несколько минут – kondal