java - Android WebSocket Services making multiple connections -
i have created web socket service. keeping making multiple connection
i want app make 1 connection, unless network connection drops make another. right now, makes 1 connection, if press home button on phone. , go on app, make connection.
thanks guys .
oncreate... of mainactivity
intent startserviceintent = new intent(this, websocketservices.class); startservice(startserviceintent);
manifest
<!-- websocket --> <receiver android:name="com.example.basicplayerapp.core.networkreceiver"> <intent-filter > <action android:name="android.net.conn.connectivity_change" /> <action android:name="android.intent.action.boot_completed" /> </intent-filter> </receiver> <service android:name="com.example.basicplayerapp.core.websocketservices"></service>
networkreceiver
public class networkreceiver extends broadcastreceiver { public static final string tag = homeactivity.class.getsimplename(); @override public void onreceive(context context, intent intent) { connectivitymanager conn = (connectivitymanager)context.getsystemservice(context.connectivity_service); networkinfo networkinfo = conn.getactivenetworkinfo(); if (networkinfo != null && networkinfo.getdetailedstate() == networkinfo.detailedstate.connected) { log.i(tag, "connected"); intent startserviceintent = new intent(context, websocketservices.class); context.startservice(startserviceintent); } else if(networkinfo != null){ networkinfo.detailedstate state = networkinfo.getdetailedstate(); log.i(tag, state.name()); } else { log.i(tag, "lost connection"); } }//end onreceive };//end networkreceiver
websocketservices
public class websocketservices extends intentservice { public static final string tag = websocketservices.class.getsimplename(); private static string socket_addr = "http://171.0.0.1:8080"; private string message = null; private websocket socket = null; public websocketservices() { super("downloadservice"); } @override protected void onhandleintent(intent intent) { log.i(tag, "onhandleintent"); //socket_addr = intent.getstringextra("ip"); if(socket==null || !socket.isopen() || socket.ispaused()) connecttopasocket(socket_addr); log.d(tag,"service invoke function"); }//end onhandleintent //===================================================================================== // socket connection //===================================================================================== private void connecttopasocket(string socket_addr) { log.i(tag, "connecttopasocket()"); // checking if (socket != null && socket.isopen()) return; // initiate web socket connection asynchttpclient.getdefaultinstance().websocket(socket_addr, null, new asynchttpclient.websocketconnectcallback() { @override public void oncompleted(exception ex, websocket websocket) { log.i(tag, "oncompleted"); if (ex != null) { log.i(tag, "oncompleted > if (ex != null)"); ex.printstacktrace(); return; } socket = websocket; socket.setstringcallback(new stringcallback() { public void onstringavailable(string s) { log.i(tag, "socket.setstringcallback > onstringavailable - s => " + s); system.out.println("i got string: " + s); message = s; }// end onstringavailable });// end socket.setstringcallback socket.setdatacallback(new datacallback() { // find out @override public void ondataavailable(dataemitter emitter, bytebufferlist bb) { log.i(tag, "socket.setdatacallback > ondataavailable | emitter=> " + emitter + " | bb => " + bb); system.out.println("i got bytes!"); // note data has been read bb.recycle(); } });// end websocket.setdatacallback }// end oncompleted });// end asynchttpclient.getdefaultinstance() }// end connecttopasocket }//end websocketservices
mrt, had similar probelm.
dont use intentservice. use service. because once intentservice has been done, finish itself.
after change service, can do, use boolean check if service has been started so:
boolean issockestarted = false; @override public int onstartcommand(intent intent, int flags, int startid) { ... if (socket == null || !socket.isopen() || socket.ispaused()) { if (issockestarted) { //not started } else { issockestarted = true; } } ....
that mean, service start once. until kill manually.
it worked me, try , let me know.
Comments
Post a Comment