2012-01-03 117 views
1

我想在sql server上做複製& android sqlite.That工作正常。Android服務 - 啓動服務並重定向到另一個活動

一旦我把發票/用戶點擊返回(我的應用程序後退按鈕)按鈕,它需要去前/後續活動&也必須開始服務。我不想等待下一個活動。

現在的問題是:我已經完成了這個使用服務。這也很好。但是當用戶點擊返回按鈕時,它會等到服務完成。之後只有它進入上一個/下一個活動。

這是我的後退按鈕的代碼:

Button reOpCancel = (Button)findViewById(R.id.reOpCancel); 
    reOpCancel.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 

       Intent i = new Intent(getBaseContext(), ListRetailerActivity.class); 
       Bundle bundle = new Bundle(); 
       bundle.putString("RetailerName", retailerName); 
       bundle.putString("RetailerCode", relailerCode); 
       bundle.putString("RouteCode", routeCode); 
       i.putExtras(bundle); 
       View vi = SalesActivityGroup.group.getLocalActivityManager().startActivity("ListRetailerActivity", i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView(); 
       SalesActivityGroup.group.replaceView(vi); 

       ConnectivityManager manager = (ConnectivityManager) getSystemService(LoginActivity.CONNECTIVITY_SERVICE); 
       boolean is3g = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isConnectedOrConnecting(); 
       boolean isWifi = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnectedOrConnecting(); 
       if(is3g ||isWifi){ 
        startService(new Intent(RetailerOptionActivity.this, UploadService.class)); 
       }else { 
        Toast.makeText(SalesActivityGroup.group.getParent(), "GPRS/WIFI is not available", Toast.LENGTH_LONG).show(); 
       } 
      } 
    }); 

這是我的服務代碼:

public class UploadService extends Service { 
private static final String TAG = "UploadService"; 
private String APPURL = ""; 
private String NAMESPACE = "http://tempuri.org/"; 
private String METHOD_NAME = "convertJSONToDataSet"; 
private String SOAP_ACTION = "http://tempuri.org/IXontService/convertJSONToDataSet"; 
ArrayList<String> uploadFiler = new ArrayList<String>();  
HashMap<Integer,String> uploadTable = new HashMap<Integer, String>(); 
private String strBusinessUnit= ""; 
private String strExecutive = ""; 
private ConnectivityManager manager; 
private Boolean is3g = false; 
private Boolean isWifi = false; 
private int networkType; 


@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"); 
    SharedPreferences myPrefs = this.getSharedPreferences("myLogedPrefs",MODE_PRIVATE); 
    strBusinessUnit = myPrefs.getString("BusinessUnit", ""); 
    strExecutive = myPrefs.getString("Executive", ""); 

    manager = (ConnectivityManager) getSystemService(DownlaodTableActivity.CONNECTIVITY_SERVICE); 
    is3g = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isConnected(); 
    isWifi = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected(); 
if (is3g) { 
     APPURL = getServicePath("G");; 
    }else if (isWifi) { 
     APPURL = getServicePath("L");; 
    }else if(networkType == TelephonyManager.NETWORK_TYPE_GPRS) { 
     APPURL = getServicePath("G");; 
    } 

} 
@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(); 

    if(! APPURL.equals("")){ 
     boolean result = uploadUsingService(); 
     if(!result) { 
      Toast.makeText(this,"Service is not working OR Time out to Connect to service !!!!!!!",Toast.LENGTH_LONG).show(); 
     } 
    }else{ 
     Toast.makeText(this, "GPRS/WIFI is not available", Toast.LENGTH_LONG).show(); 
    } 

    Log.d(TAG, "onStart"); 
    onDestroy(); 

} 

    uploadTable = getUploadTable(); 

    boolean result = true; 

    DBAdapter dbAdapter = DBAdapter.getDBAdapterInstance(this); 
    dbAdapter.openDataBase(); 
    System.out.println("==APPURL="+APPURL); 


     try { 
      if(uploadTable.size() > 0){ 
       for (Map.Entry<Integer, String> entry : uploadTable.entrySet()) { 
        String value = entry.getValue(); 
        if(value.equals("WMInvoiceHeader")){ 
         result = getInvoiceHeader(); 
        }else if(value.equals("WMInvoiceLine")){ 
         result = getInvoiceLine(); 
        }else if(value.equals("WMInvoiceHeaderDiscount")){ 
         result = getInvoiceHeaderDiscount(); 
        }else if(value.equals("WMInvoiceSpecialDiscount")){ 
         result = getInvoiceSpecialDiscount(); 
        }else if(value.equals("WMInvoiceCancelHeader")){ 
         result = getInvoiceCancelHeader(); 
        }else if(value.equals("WMInvoiceCancelLine")){ 
         result = getInvoiceCancelLine(); 
        }else if(value.equals("WMTransactionControl")){ 
         result = getTransactionControl(); 
        }else if(value.equals("WMVisitDetail")){ 
         result = getVisitDetail(); 
        }else if(value.equals("WMVisitHeader")){ 
         result = getVisitHeader(); 
        }else if(value.equals("WMReturnHeader")){ 
         result = getReturnHeader(); 
        }else if(value.equals("WMReturnLine")){ 
         result = getReturnLine(); 
        }else if(value.equals("WMPaymentReceipt")){ 
         result = getPaymentReceipt(); 
        }else if(value.equals("WMPaymentAllocation")){ 
         result = getPaymentAllocation(); 
        } 
        System.out.println("==result=="+result); 
        if(!result) break; 
       } 


     } 
     dbAdapter.close(); 
     } catch (Exception e) { 
      System.out.println("==ERROR=="+e.getMessage()); 
      e.printStackTrace(); 
     } 


    return result; 
} 

Problem is don't need to wait until finish service, it need to go next activity

請幫我從這個問題。

+0

爲什麼不在新線程中啓動服務? – 2012-01-03 08:52:13

回答

4

我沒有得到你的問題,但在閱讀你的代碼後,我知道你的活動沒有開始,直到服務工作完成了嗎?

Android服務在UI線程上運行。 如果你想在服務中做一些更好的工作,你可以在服務中使用線程。它不會阻塞你的UI線程,並且線程(UI和背景)將同時工作。

+0

是的。這是我的問題。哪裏想寫Thread?呼籲地方或..請引導我在此... – Piraba 2012-01-03 09:19:22

+0

在服務你必須寫一個線程。 – Dharmendra 2012-01-03 09:20:40

+0

謝謝,我會試試這個。你有任何示例應用程序或代碼? – Piraba 2012-01-03 09:22:25