Search code examples
androidsql-serverandroid-ksoap2

How to use background service with KSOAP2 that active when there is connect to server?


I'm working in my project which has a SQLLIT and interacts with SQL-server. In my server I want to know: how can I make a service that listens to my sqllite table and checks if there is a new record in any of tables? It's passing this record to server using ksoap2.

Also I need to make my service first check if there is a network available or not.


Solution

  • I believe your SQLite table changes from an activity (somehow requires some sort of user interaction). So i would suggest the following approach:

    1. Create a SQLite table with some listeners that are called whenever the table performs any CRUD operation.

      public class YourSqliteTable {
      
      private TableListener listener;
      
      public void insert(Object urData){
      
      //insert data here to sqlite table
      // call the listener
        listener.onInsert(urData);
      
      }
      }
      
      public interface TableListener{
      
      public void onInsert(Object tableRow);
      
      }
      

    2.create a service that handles soap messages and listens to SQLite table:

    public class SoapService extend Service implements TableListener{
    
         private HanlderThread soapThread;
         private Handler       soapHandler;
    
         public void onCreate(){
    
            soapThread = new HandlerThread("handler_thread");
            soapThread.start();
            soapHandler = new Handler(soapThread.getLooper){
    
            public void handleMessage(Message msg) {
    
                switch(msg.what){
                    case(1)://send data to server
                    HttpTransportSE transporter    = new HttpTransportSE(Server.TIGA_SERVER_IP
                                                             + SOAP_URL);
                    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
                    SoapSerializationEnvelope sEnv = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    
                    try { 
                        request.addProperty("data", msg.obj);
                        sEnv.dotNet = true;
                        sEnv.setOutputSoapObject(request);
                        transporter.call(NAMESPACE + METHOD_NAME, sEnv);
                        SoapObject response = (SoapObject) sEnv.getResponse();
                        return response.toString();
                    } catch (Exception e) { 
                      e.printStackTrace();
                    } finally{
                      transporter.reset();
                    }
                    break;
                }
            }
    
         }
    
         @Override
         public void onInsert(Object tableRow){
    
            Message msg = new Message();
            msg.what = 1;
            msg.obj  = tableRow;
            soapHandler.sendMessage(msg);
         }
    
    }
    
    1. Bind the user activity to the SoapService and when binding is established (onServiceConnected is called) register the service as a listener to the SQLite table.

    2. Checking if internet connection is available can be done as :

      public boolean isNetworkOn(){

      ConnectivityManager conMan = (ConnectivityManager) 
                                   getSystemService(CONNECTIVITY_SERVICE);
      NetworkInfo activeNet = conMan.getActiveNetworkInfo();
      
      if(activeNet == null)
          return false;
      
      if(activeNet.isAvailable() && activeNet.isConnected())
          return true;
      
      return false;
      }