package com.openfire.service;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.packet.Presence;
import com.openfire.manager.XmppConnection;
import com.partynetwork.dataprovider.util.T;
import com.partynetwork.iparty.app.AppContext;
import com.partynetwork.iparty.imessage.OpenfireConstant;
import com.partynetwork.iparty.login.OpenfireLoginTask;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.IBinder;
/**
*
* 重连接服务.
*
* @author shimiso
*/
public class ReConnectService extends Service {
private Context context;
private ConnectivityManager connectivityManager;
private NetworkInfo info;
@Override
public void onCreate() {
context = this;
IntentFilter mFilter = new IntentFilter();
mFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(reConnectionBroadcastReceiver, mFilter);
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
unregisterReceiver(reConnectionBroadcastReceiver);
super.onDestroy();
}
BroadcastReceiver reConnectionBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
connectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
XMPPConnection connection = XmppConnection.getInstance()
.getConnection();
info = connectivityManager.getActiveNetworkInfo();
if (info != null && info.isAvailable()) {
if (!connection.isConnected()) {
reConnect(connection);
} else {
sendInentAndPre(OpenfireConstant.RECONNECT_STATE_SUCCESS);
//T.showLong(context, "用户已上线!");
}
} else {
sendInentAndPre(OpenfireConstant.RECONNECT_STATE_FAIL);
//T.showLong(context, "网络断开,用户已离线!");
}
}
}
};
/**
*
* 递归重连,直连上为止.
*
* @author shimiso
*/
public void reConnect(XMPPConnection connection) {
try {
connection.connect();
if (connection.isConnected()) {
Presence presence = new Presence(Presence.Type.available);
connection.sendPacket(presence);
AppContext acontext=(AppContext) context.getApplicationContext();
OpenfireLoginTask task = new OpenfireLoginTask(this,
acontext.getLoginUid() + "", acontext.getLoginInfo()
.getPwd());
task.execute();
//T.showLong(context, "用户已上线!");
}
} catch (XMPPException e) {
reConnect(connection);
}
}
private void sendInentAndPre(boolean isSuccess) {
Intent intent = new Intent();
SharedPreferences preference = getSharedPreferences(
OpenfireConstant.LOGIN_SET, 0);
// 保存在线连接信息
preference.edit().putBoolean(OpenfireConstant.IS_ONLINE, isSuccess)
.commit();
intent.setAction(OpenfireConstant.ACTION_RECONNECT_STATE);
intent.putExtra(OpenfireConstant.RECONNECT_STATE, isSuccess);
sendBroadcast(intent);
}
}