2011-11-24 126 views
1

我的要求是:Android的服務:如何啓動服務

我要上傳的SQLite表記錄到MS SQL server.I已經service.Normal上傳工作阿洛斯登錄後罰款(普通上傳方式,它會顯示上傳表信息列表。當用戶點擊上傳按鈕時,它會上傳&轉到下一個屏幕)。現在我想這樣做:銷售代表保存發票/付款,然後服務啓動&上傳數據在後端SQL服務器,而不影響其餘的代碼。

我不喜歡這樣的:

public class UploadService extends Service { 
    private static final String TAG = "UploadService"; 
    public static final String APPURL = "http://192.168.1.213:7986/XontService"; 
    private static final String NAMESPACE = "http://tempuri.org/"; 
    private static final String METHOD_NAME = "convertJSONToDataSet"; 
    private static String SOAP_ACTION = "http://tempuri.org/IXontService/convertJSONToDataSet"; 
    ArrayList<String> uploadFiler = new ArrayList<String>(); 
    HashMap<Integer,String> uploadTable = new HashMap<Integer, String>(); 

    @Override 
    public IBinder onBind(Intent arg0) { 
    return null; 
    } 

    @Override 
    public void onCreate() { 
    Toast.makeText(this, "Upload Service Created", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onCreate"); 
    uploadUsingService(); 

    } 

    @Override 
    public void onDestroy() { 
    Toast.makeText(this, "Upload Service Stopped", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onDestroy"); 
    } 

    @Override 
    public void onStart(Intent intent, int startid) { 
    Toast.makeText(this, "Upload Service Started", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onStart"); 

    } 


    public void uploadUsingService(){ 
    uploadTable = getUploadTable(); 
    if(uploadTable.size() > 0){ 
     for (Map.Entry<Integer, String> entry : uploadTable.entrySet()) { 
     System.out.println("----key" + entry.getKey()); 
     String value = entry.getValue(); 

     if(value.equals("WMInvoiceHeader")){ 
      getInvoiceHeader(); 
     } 
     } 
    } 
    } 

    public void getInvoiceHeader(){ 
    boolean serviceStatus =true; 
    DBAdapter dbAdapter = DBAdapter.getDBAdapterInstance(this); 
    // dbAdapter.openDataBase(); 

    SharedPreferences myPrefs = this.getSharedPreferences("myLogedPrefs",MODE_PRIVATE); 
     String strBusinessUnit = myPrefs.getString("BusinessUnit", ""); 
     String strExecutive = myPrefs.getString("Executive", ""); 

     try{ 
     StringBuffer invoiceHeader = new StringBuffer(); 
     JSONArray jaHeader = new JSONArray(); 
     String query = "SELECT BusinessUnit,ExecutiveCode,InvoiceNo,SalesCategory,RetailerCode," +//4 
       " RetailerCodeSon,InvoiceDate,GrossValue,InvoiceValue,TotalLineDiscount," + //9 
       " TotalHeaderDiscount,VATValue,UpdatedOn,UpdatedBy,UploadFlag,VisitNumber ," + //15 
       " VisitSequence,RouteCode,SalesType,ActiveStatus,UploadedOn,UploadedBy,UploadedMethod," + 
       " UploadedType,RetailerType,HeaderDiscountFlag,SpecialDiscountFlag,TXNReference,TourReference" + 
       " FROM WMInvoiceHeader " + 
       " WHERE (CancelFlag IS NULL OR CancelFlag ='0')"; 
     ArrayList<?> stringList = dbAdapter.selectRecordsFromDBList(query, null); 
     if(stringList.size() > 0){ 
     invoiceHeader.append("{\"WMInvoiceHeader\":"); 
      for (int i = 0; i < stringList.size(); i++) { 
      ArrayList<?> arrayList = (ArrayList<?>) stringList.get(i); 
      ArrayList<?> list = arrayList; 
      JSONObject invHeader = new JSONObject(); 
      invHeader.put("BusinessUnit",(String)list.get(0)); 
      invHeader.put("ExecutiveCode",(String)list.get(1)); 
      invHeader.put("InvoiceDate",(String)list.get(6)); 
      invHeader.put("VisitSequence",(String)list.get(16)); 
      invHeader.put("RouteCode",(String)list.get(17)); 
      invHeader.put("SalesType",(String)list.get(18));   
      jaHeader.put(invHeader); 
      } 
     } 
     invoiceHeader.append(jaHeader.toString()); 
     invoiceHeader.append("}"); 
     serviceStatus = soapPrimitiveData("WMInvoiceHeader", strBusinessUnit, strExecutive, invoiceHeader.toString()); 

     }catch (IOException e) { 
     serviceStatus =false; 
     e.printStackTrace(); 
     } catch (XmlPullParserException e) { 
     serviceStatus =false; 
     e.printStackTrace(); 
     }catch (Exception e) { 
     serviceStatus =false; 
     e.printStackTrace(); 
     }finally{ 
     if(!serviceStatus){ 
      uploadFiler.add("WMInvoiceHeader"); 
     } 
     } 


    } 

    public boolean soapPrimitiveData(String tablename,String strBusinessUnit, String strExecutive,String jsonString) throws IOException,XmlPullParserException { 
    SoapPrimitive responsesData = null; 
    boolean status =false; 
    SoapObject requestData = new SoapObject(NAMESPACE, METHOD_NAME); // set 
    requestData.addProperty("strBusinessUnit", strBusinessUnit); 
    requestData.addProperty("strExecutiveCode", strExecutive); 
    requestData.addProperty("strTableName", tablename); 
    requestData.addProperty("jsonContent", jsonString); 
    SoapSerializationEnvelope envelopes = new SoapSerializationEnvelope(SoapEnvelope.VER11); // put all required data into a soap//// envelope 
    envelopes.dotNet = true; 
    envelopes.setOutputSoapObject(requestData); 
    AndroidHttpTransport httpTransport = new AndroidHttpTransport(APPURL); 
    httpTransport.debug = true; 
    try { 
     httpTransport.call(SOAP_ACTION, envelopes); 
     responsesData = (SoapPrimitive) envelopes.getResponse(); 
     if((responsesData.toString()).equals("true")){ 
     DBAdapter dbAdapter = DBAdapter.getDBAdapterInstance(UploadService.this); 
     status = dbAdapter.updateUploadedTable(tablename, strExecutive, strBusinessUnit); 
     } 


    } catch (SocketException ex) { 
     status = false; 
     Log.e("Error : " , "Error on soapPrimitiveData() " + ex.getMessage()); 
     ex.printStackTrace(); 
    } catch (Exception e) { 
     status = false; 
     Log.e("Error : " , "Error on soapPrimitiveData() " + e.getMessage()); 
     e.printStackTrace(); 
     } 
    return status; 
    } 


    public HashMap<Integer,String> getUploadTable(){ 
    DBAdapter dbAdapter = DBAdapter.getDBAdapterInstance(this); 
     dbAdapter.openDataBase(); 

     SharedPreferences myPrefs = this.getSharedPreferences("myLogedPrefs",MODE_PRIVATE); 
    String strBusinessUnit = myPrefs.getString("BusinessUnit", ""); 
    String strExecutive = myPrefs.getString("Executive", ""); 


     HashMap<Integer,String> uploadTableMap = new HashMap<Integer,String>(); 
     try { 
     String query = "SELECT TableName FROM WMPalmUploadControl WHERE Upload = '1' AND BusinessUnit =? AND ExecutiveCode = ?;"; 
     String[] d = new String[]{strBusinessUnit,strExecutive}; 
     ArrayList<?> stringList = dbAdapter.selectRecordsFromDBList(query, d); 
     if(stringList.size() > 0){ 
      for (int i = 0; i < stringList.size(); i++) { 
      ArrayList<?> arrayList = (ArrayList<?>) stringList.get(i); 
      ArrayList<?> list = arrayList; 
      uploadTableMap.put(i, (String)list.get(0)); 
      } 

     } 
     dbAdapter.close(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return uploadTableMap; 
    } 

} 

在這裏,我想打電話給在onStart()uploadUsingService()方法。

這是我的調用代碼:

if(is3g ||isWifi){ 
      startService(new Intent(this, UploadService.class)); 
    }else if (networkType == TelephonyManager.NETWORK_TYPE_GPRS) { 
      if(signalStrengthInt > 10){ ....} 

    } 

當我運行這段代碼:我得到這個onCreate()' method吐司message上傳服務創建. '在onStart()`吐司消息不顯示。我怎麼稱呼這個。我這樣做了這部分Link

請有人幫我解決這個問題嗎?

回答