환경 : : 일대일/일대 다 장치에서 메시지를 중단없이 전달하려면 XMPPService를 백그라운드에서 STICKY 서비스로 실행해야합니다. 메시지를 받으려면 패킷이 장치에 도착할 때마다 발생하는 PacketListener가 있습니다. 클라이언트 측 구현을 위해 asmack 라이브러리를 사용하고 XMPP 서버로 OpenFire를 사용하고 있습니다.고정 서비스에서 영구 XMPP 연결을 유지할 수 없습니다.
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이되는 이유는 알려져 있지 않습니다. 연결이 null이되면 PacketListener는 작동을 멈 춥니 다.
내가 시도 무엇 모든 : 서버에 연결하고 청취자를 초기화
- 구현 끈적 서비스를 제공합니다.
- AlarmManager를 구현하여 서비스가 백그라운드에서 실행 중인지 확인합니다. 또한 연결이 활성 상태이고 정기적으로 인증되는지 여부를 확인합니다. (배수구)
- XMPP 사양 XEP-0199에 따라 Ping 관리자가 구현되었습니다.
누군가가이 문제를 조사 할 수 있습니까?
문제를 해결할 수 있습니까? 아직 문제가 없습니다. – kondal
. 당신은 정확히 무엇을 경험하고 있는지 설명 할 수 있습니까? – subhendupsingh
같은 문제 나는 약간의 분 후에 듣지 않는 서비스에서 패킷 수신기를 등록했다 – kondal