2016-11-16 90 views
0

我尝试在应用程序被杀后等待移动设备连接到wifi,然后完成任务并停止服务后创建服务,它在我发送任务时工作正常而应用程序亦不是被杀,但之后我杀的应用服务不会退出完成任务后,Android stop start_sticky服务

我有三个类,主类,我启动服务

 public class MainActivity extends AppCompatActivity { 

    //----------------------USER FIELDS --------------------> 

    Spinner Category; 
    EditText Description; 
    EditText Address; 
    EditText Date; 
    EditText Time; 
    EditText Name; 
    EditText Email; 
    EditText Phone; 

    //-----------------------CONSTANTS----------------------> 

    private static final int NUM_PAGES = 5; 
    private static final int CAMERA_VALUE = 301; 

    //----------------------IMAGE DIRECTORY-----------------> 

    String root; 
    String imageFolderPath; 
    String imageName; 
    Uri fileUri; 
    ArrayList<Uri> fileUris = new ArrayList<>(); 
    ArrayList<String> filepaths; 
    ArrayList<String> photoPaths; 
    List<String> Images = new ArrayList<>(); 

    //----------------------FRAGMENTS-----------------------> 

    SplashFragment splashFragment = new SplashFragment(); 
    DescFragment descFragment = new DescFragment(); 
    InfoFragment infoFragment = new InfoFragment(); 
    ChooserFragment chooserFragment = new ChooserFragment(); 
    SuccessFragment successFragment = new SuccessFragment(); 

    //-------------------DATABASE HANDLER-------------------> 

    DatabaseHandler db = new DatabaseHandler(this); 

    //---------------------DIALOGS--------------------------> 

    Dialog infoDialog; 
    Dialog languageDialog; 

    //-----------------SHARED PREFS-------------------------> 

    SharedPreferences prefs = null; 

    //--------------IMAGEVIEW PREVIEWS----------------------> 

    ArrayList<ImageView> img = new ArrayList<>(); 

    //-----------------COUNTERS-----------------------------> 

    private static int image_counter = 0; 

    //----------VIEWPAGER AND VIEWPAGER ADAPTER-------------> 
    private ViewPager mPager; 
    private PagerAdapter mPagerAdapter; 


    TextInputLayout description_layout; 
    TextInputLayout spinner_layout; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     //-------------CHECK FOR PERMISSIONS----------------> 

     if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) 
     { 
      ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.INTERNET, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}, 0); 
     } 

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     findViewById(R.id.mainLayout).requestFocus(); 

     mPager = (ViewPager) findViewById(R.id.pager); 
     mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager()); 
     mPager.setAdapter(mPagerAdapter); 

     prefs = getSharedPreferences("co.milingona.socialactivist", MODE_PRIVATE); 

     selectLanguge(prefs.getString("language","sq"), false); 

     if(prefs.getBoolean("firstTimeRunning",true)) 
     { 
      createShortcut(); 
      prefs.edit().putBoolean("firstTimeRunning",false).commit(); 
     } 
    } 
    @Override 
    protected void onResume() 
    { 
     super.onResume(); 
    } 

    private void restartActivity() 
    { 
     Intent intent = getIntent(); 
     finish(); 
     startActivity(intent); 
    } 
    private void selectLanguge(String language, boolean restart) 
    { 
     prefs.edit().putString("language", language).commit(); 

     String languageToLoad = language; // your language 
     Locale locale = new Locale(languageToLoad); 
     Locale.setDefault(locale); 
     Configuration config = new Configuration(); 
     config.setLocale(locale); 
     getBaseContext().getResources().updateConfiguration(config, 
       getBaseContext().getResources().getDisplayMetrics()); 

     if(restart == true) { 
      restartActivity(); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) 
    { 
      getMenuInflater().inflate(R.menu.menu_main, menu); 
      return true; 
    } 

    @Override 
    public void onBackPressed() { 
     if (mPager.getCurrentItem() == 0) { 
      super.onBackPressed(); 
     } 
     else if(mPager.getCurrentItem() == 4) 
     { 
      restartActivity(); 
     } else { 
      mPager.setCurrentItem(mPager.getCurrentItem() - 1); 
     } 
    } 


    public void splash_raporto(View view) 
    { 
     mPager.setCurrentItem(mPager.getCurrentItem() + 1); 
    } 

    public void desc_prev(View view) 
    { 

     if (view != null) { 
      InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
      imm.hideSoftInputFromWindow(view.getWindowToken(), 0); 
     } 
     mPager.setCurrentItem(mPager.getCurrentItem() - 1); 

    } 
    public void desc_next(View view) 
    { 
     description_layout= (TextInputLayout) findViewById(R.id.description_layout); 
     spinner_layout= (TextInputLayout) findViewById(R.id.spinner_layout); 

     boolean continuePager = true; 

     Category = (Spinner)findViewById(R.id.category); 
     Description = (EditText)findViewById(R.id.description); 

     if(Description.getText().toString().trim().length() == 0) 
     { 
      description_layout.setError(getText(R.string.description)); 
      continuePager=false; 

     } else { 

      description_layout.setErrorEnabled(false); 
     } 



     if(Category.getSelectedItem().toString().trim() == "Zgjidhni Kategorinë") 
     { 
      spinner_layout.setError(getText(R.string.category)); 
      continuePager=false; 
     } 

     if(continuePager == true) 
     { 
      mPager.setCurrentItem(mPager.getCurrentItem()+1); 

      if (view != null) { 
       InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
       imm.hideSoftInputFromWindow(view.getWindowToken(), 0); 
      } 
     } 

    } 

    public void info_prev(View view) 
    { 
     mPager.setCurrentItem(mPager.getCurrentItem()-1); 
    } 

    public void info_next(View view) 
    { 
     Address = (EditText)findViewById(R.id.address); 
     this.Date = (EditText)findViewById(R.id.date); 
     Time = (EditText)findViewById(R.id.time); 
     Name = (EditText)findViewById(R.id.name); 
     Email = (EditText)findViewById(R.id.email); 
     Phone = (EditText)findViewById(R.id.phone); 

     if(Email.getText().toString().trim().length()!=0) 
     { 
      if(isValidEmail(Email.getText().toString())) 
      { 
       mPager.setCurrentItem(mPager.getCurrentItem()+1); 
      } 
      else{ 
       Email.setBackground(getResources().getDrawable(R.drawable.border_bottom_red)); 
      } 
     } 
     else { 
      mPager.setCurrentItem(mPager.getCurrentItem() + 1); 
      Email.setBackground(getResources().getDrawable(R.drawable.border_bottom_white)); 
     } 

     if (view != null) { 
      InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
      imm.hideSoftInputFromWindow(view.getWindowToken(), 0); 
     } 
    } 

    public void choose_dergo(View view) 
    { 
     mPager.setCurrentItem(mPager.getCurrentItem()+1); 

     for (Uri uri: fileUris) { 
      Images.add(uri.toString()); 
     } 

     db.addReport(new Report(Category.getSelectedItem().toString(),Description.getText().toString(),"Mitrovice", Address.getText().toString(),this.Date.getText().toString() + " " + Time.getText().toString(), Name.getText().toString(), Email.getText().toString(), Phone.getText().toString(), Images.toArray(new String[Images.size()]))); 

     if(CheckConnectivityService.running==false) 
     { 
      Intent stickyService=new Intent(this, CheckConnectivityService.class); 
      startService(stickyService); 
      CheckConnectivityService.running=true; 
     } 
    } 

    public void camera_intent(View view) 
    { 
     if(image_counter<5) 
     { 
      root = Environment.getExternalStorageDirectory() 
        + "/SocialAcitivist"; 
      imageFolderPath = root + "/Images"; 
      File imagesFolder = new File(imageFolderPath); 
      imagesFolder.mkdirs(); 
      Date d = new Date(); 
      CharSequence s = DateFormat.format("hh-mm-ss", d.getTime()); 
      imageName = "img-" + s + ".jpg"; 
      File image = new File(imageFolderPath, imageName); 
      fileUri = Uri.fromFile(image); 
      Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); 
      startActivityForResult(takePictureIntent, CAMERA_VALUE); 
     } 
     else{ 
      Toast.makeText(this,"First delete some pictures below",Toast.LENGTH_SHORT).show(); 
     } 
    } 

    public void gallery_intent(View view) 
    { 
     FilePickerBuilder.getInstance().setMaxCount(5-image_counter) 
       .setSelectedFiles(filepaths) 
       .setActivityTheme(R.style.AppTheme) 
       .pickPhoto(this); 
    } 

    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    { 

     if (requestCode == CAMERA_VALUE) { 
      fileUris.add(fileUri); 
      image_counter++; 
     } 

     if (requestCode == FilePickerConst.REQUEST_CODE_PHOTO && resultCode == RESULT_OK && data != null) 
     { 
      photoPaths = new ArrayList<>(); 
      photoPaths.addAll(data.getStringArrayListExtra(FilePickerConst.KEY_SELECTED_PHOTOS)); 

      for (String photopath : photoPaths) 
      { 
       fileUris.add(Uri.fromFile(new File(photopath))); 
       image_counter++; 
      } 
     } 

     img.add(0, (ImageView)findViewById(R.id.prev1)); 
     img.add(1, (ImageView)findViewById(R.id.prev2)); 
     img.add(2, (ImageView)findViewById(R.id.prev3)); 
     img.add(3, (ImageView)findViewById(R.id.prev4)); 
     img.add(4, (ImageView)findViewById(R.id.prev5)); 

     int img_counter=0; 

     for(Uri uri:fileUris) 
     { 
      img.get(img_counter).setImageURI(uri); 
      img_counter++; 
     } 
    } 

    public void showTimePickerDialog(View v) 
    { 
     DialogFragment newFragment = new TimePickerFragment(); 
     newFragment.show(getSupportFragmentManager(), "timePicker"); 
    } 

    public void showDatePickerDialog(View v) 
    { 
     DialogFragment newFragment = new DatePickerFragment(); 
     newFragment.show(getSupportFragmentManager(), "datePicker"); 
    } 
    public void OpenInformation(MenuItem item) 
    { 
     infoDialog=new Dialog(this,R.style.AppTheme_Dark); 
     infoDialog.setContentView(R.layout.infromation_layout); 
     infoDialog.show(); 
    } 

    public void close_info_dialog(View view) 
    { 
     infoDialog.dismiss(); 
    } 

    public void OpenLanguages(MenuItem item) 
    { 
     languageDialog=new Dialog(this, R.style.AppTheme_Dark_Dialog); 
     languageDialog.setContentView(R.layout.language_layout); 
     languageDialog.show(); 
    } 

    public void ChangeLanguage(View view) 
    { 
     switch (view.getId()) 
     { 
      case R.id.sq: 
       if(prefs.getString("language","en").equalsIgnoreCase("en")) 
       { 
        selectLanguge("sq", true); 
       } 
       break; 
      case R.id.en: 
       if(prefs.getString("language","sq").equalsIgnoreCase("sq")) 
       { 
        selectLanguge("en", true); 
       } 
       break; 
     } 

     languageDialog.dismiss(); 
    } 

    public void removeItem(View view) 
    { 
     int img_counter=0; 

     try{ 
      switch (view.getId()) 
      { 
       case R.id.prev1: 

        fileUris.remove(0); 
        for(Uri uri:fileUris) 
        { 
         img.get(img_counter).setImageURI(uri); 
         img_counter++; 

        } 
        img.get(img_counter).setImageURI(null); 

        break; 
       case R.id.prev2: 

        fileUris.remove(1); 
        for(Uri uri:fileUris) 
        { 
         img.get(img_counter).setImageURI(uri); 
         img_counter++; 

        } 
        img.get(img_counter).setImageURI(null); 

        break; 
       case R.id.prev3: 

        fileUris.remove(2); 
        for(Uri uri:fileUris) 
        { 
         img.get(img_counter).setImageURI(uri); 
         img_counter++; 

        } 
        img.get(img_counter).setImageURI(null); 

        break; 
       case R.id.prev4: 

        fileUris.remove(3); 
        for(Uri uri:fileUris) 
        { 
         img.get(img_counter).setImageURI(uri); 
         img_counter++; 

        } 
        img.get(img_counter).setImageURI(null); 

        break; 
       case R.id.prev5: 

        fileUris.remove(4); 
        for(Uri uri:fileUris) 
        { 
         img.get(img_counter).setImageURI(uri); 
         img_counter++; 

        } 
        img.get(img_counter).setImageURI(null); 


        break; 
      } 
      image_counter--; 
     } 
     catch(Exception e){} 

    } 

    public void openURL(View view) { 
     String url; 
     switch (view.getId()) 
     { 
      case R.id.facebook: url="https://www.facebook.com"; 
       break; 
      case R.id.twitter: url="https://www.twitter.com"; 
       break; 
      case R.id.wordpress: url="https://www.facebook.com"; 
       break; 
      default: url="https://www.facebook.com"; 
       break; 
     } 
     Intent i = new Intent(Intent.ACTION_VIEW); 
     i.setData(Uri.parse(url)); 
     startActivity(i); 
    } 

    public static class TimePickerFragment extends DialogFragment 
      implements TimePickerDialog.OnTimeSetListener 
    { 
     @Override 
     public Dialog onCreateDialog(Bundle savedInstanceState) 
     { 
      final Calendar c = Calendar.getInstance(); 
      int hour = c.get(Calendar.HOUR_OF_DAY); 
      int minute = c.get(Calendar.MINUTE); 

      return new TimePickerDialog(getActivity(), R.style.AppTheme_Dark_Dialog, this, hour, minute, 
        DateFormat.is24HourFormat(getActivity())); 
     } 


     public void onTimeSet(TimePicker view, int hourOfDay, int minute) 
     { 
      EditText editTime=(EditText)getActivity().findViewById(R.id.time); 
      editTime.setText(hourOfDay+":"+minute); 
     } 
    } 

    public static class DatePickerFragment extends DialogFragment 
      implements DatePickerDialog.OnDateSetListener 
    { 

     @Override 
     public Dialog onCreateDialog(Bundle savedInstanceState) 
     { 
      final Calendar c = Calendar.getInstance(); 
      int year = c.get(Calendar.YEAR); 
      int month = c.get(Calendar.MONTH); 
      int day = c.get(Calendar.DAY_OF_MONTH); 
      DatePickerDialog dialog = new DatePickerDialog(getActivity(), R.style.AppTheme_Dark_Dialog, this, year, month, day); 
      dialog.getDatePicker().setMaxDate(new Date().getTime()); 

      return dialog; 
     } 


     public void onDateSet(DatePicker view, int year, int month, int day) 
     { 
      EditText editDate=(EditText)getActivity().findViewById(R.id.date); 
      editDate.setText(year+"-"+month+"-"+day); 
     } 
    } 

    private boolean isValidEmail(String email) 
    { 
     String EMAIL_PATTERN = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@" 
       + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$"; 

     Pattern pattern = Pattern.compile(EMAIL_PATTERN); 
     Matcher matcher = pattern.matcher(email); 
     return matcher.matches(); 
    } 

    private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter 
    { 

     public ScreenSlidePagerAdapter(FragmentManager fm) 
     { 
      super(fm); 
     } 

     @Override 
     public Fragment getItem(int position) 
     { 
      switch (position) 
      { 
       case 0: return splashFragment; 
       case 1: return descFragment; 
       case 2: return infoFragment; 
       case 3: return chooserFragment; 
       case 4: return successFragment; 
       default: return splashFragment; 
      } 
     } 

     @Override 
     public int getCount() 
     { 
      return NUM_PAGES; 
     } 
    } 

    private void createShortcut() 
    { 
     final Intent shortcutIntent = new Intent(this, MainActivity.class); 
     final Intent intent = new Intent(); 
     intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); 
     intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name)); 
     intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(this, R.mipmap.ic_launcher)); 
     intent.setAction("com.android.launcher.action.INSTALL_SHORTCUT"); 
     sendBroadcast(intent); 
    } 
} 

然后我得到的服务类

public final class CheckConnectivityService extends IntentService { 
    Context context = this; 
    NetworkConnectivityCheck networkConnectivityCheck = new NetworkConnectivityCheck(); 
    public Thread backgroundThread; 
    public static boolean running = false; 
    public static boolean stop = false; 
    public static Intent _intent; 
    public CheckConnectivityService() { 
     super("S"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     _intent=intent; 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     _intent=intent; 
     networkConnectivityCheck.register(context); 
     this.backgroundThread.start(); 
     running = false; 
     return START_STICKY; 
    } 

    @Override 
    public void onDestroy() { 
     networkConnectivityCheck.unregister(context); 
     backgroundThread.interrupt(); 
    } 

    @Override 
    public void onCreate() { 
     this.backgroundThread = new Thread(myTask); 

    } 

    private Runnable myTask = new Runnable() { 
     public void run() { 
      while (running == true) { 

        if (stop == true) { 
         stop = false; 
         stopSelf(); 
        } 
       } 
      } 
     }; 
    } 

和我的第三类,我检查,如果互联网可如果是上传的形式,使服务站

public class NetworkConnectivityCheck { 

    public boolean internetAvailable = false; 
    private BroadcastReceiver networkChangeReceiver; 
    List<Report> reports; 

    NetworkConnectivityCheck(){ 
     this.networkChangeReceiver = new BroadcastReceiver() 
     { 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       int networkState = NetworkUtil.getConnectionStatus(context); 
       DatabaseHandler db=new DatabaseHandler(context); 
       if(networkState == NetworkUtil.NOT_CONNECTED){ 
        internetAvailable = false; 


       } else if(networkState == NetworkUtil.MOBILE){ 
        internetAvailable = true; 
        //MainActivity.tvStatus.setText("ONLINE"); // you do something here. 
       } else if(networkState == NetworkUtil.WIFI){ 

        internetAvailable = true; 

         if(db.getReportsCount()!=0){ 
          reports=db.getAllReports(); 
          for(Report report : reports){ 
           Upload upload=new Upload(report); 
           Thread doInBackground = new Thread(upload); 
           doInBackground.start(); 
          } 

          db.deleteAll(); 
          CheckConnectivityService.running=true; 
          CheckConnectivityService.stop=true; 

        } 
       } 
      } 
     }; 
    } 
    public void register(Context context) 
    { 
     context.registerReceiver(networkChangeReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); 
    } 
    public void unregister(Context context) 
    { 
     context.unregisterReceiver(networkChangeReceiver); 
    } 

    public class Upload implements Runnable 
    { 
     Report report; 
     public Upload(Report _report) 
     { 
      report=_report; 
     } 
     @Override 
     public void run() { 
      try { 
       MediaType MEDIA_TYPE_JPEG = MediaType.parse("image/jpeg"); 

       OkHttpClient client = new OkHttpClient.Builder() 
         .connectTimeout(30, TimeUnit.SECONDS) 
         .writeTimeout(120, TimeUnit.SECONDS) 
         .readTimeout(20, TimeUnit.SECONDS) 
         .build(); 

       MultipartBody.Builder mRequestBody = new MultipartBody.Builder().setType(MultipartBody.FORM); 

       mRequestBody.addFormDataPart("category", report.getCategory()); 
       mRequestBody.addFormDataPart("description", report.getDescription()); 
       mRequestBody.addFormDataPart("city", report.getCity()); 
       mRequestBody.addFormDataPart("address", report.getAddress()); 
       mRequestBody.addFormDataPart("datetime", report.getDateTime()); 
       mRequestBody.addFormDataPart("name", report.getName()); 
       mRequestBody.addFormDataPart("email", report.getEmail()); 
       mRequestBody.addFormDataPart("phone", report.getPhone()); 

       if(report.getImages()[0].trim().length()!=0) { 
        ArrayList<Uri> fileUris = new ArrayList<>(); 
        for (String uri : report.getImages()) 
        { 
         fileUris.add(Uri.parse(uri)); 
        } 

        for (Uri FileUri : fileUris) 
        { 
         File file = new File(FileUri.getPath()); 

         RequestBody imageBody = RequestBody.create(MEDIA_TYPE_JPEG, file); 
         mRequestBody.addFormDataPart("images[]", FileUri.getLastPathSegment(), imageBody); 
        } 
       } 
       RequestBody requestBody = mRequestBody.build(); 

       Request request = new Request.Builder() 
         .addHeader("Content-Type","text/json; Charset=UTF-8") 
         .header("Authorization", "Basic bWlsaW5nb25hOlN0") 
         .url("http://LINK.com") 
         .post(requestBody) 
         .build(); 

       Response response = client.newCall(request).execute(); 


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

      Thread.currentThread().interrupt(); 

      return; 
     } 

    } 
} 

,这里是万一NetworkUtil U类想了解更

public class NetworkUtil 
{ 
    public static final int NOT_CONNECTED = 0; 
    public static final int WIFI = 1; 
    public static final int MOBILE = 2; 
    public static int getConnectionStatus(Context context) 
    { 
     ConnectivityManager connectivityManager = 
       (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); 

     if(networkInfo != null) 
     { 
      if(networkInfo.getType() == ConnectivityManager.TYPE_WIFI) 
      { 
       return WIFI; 
      } 

      if(networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) 
      { 
       return MOBILE; 
      } 
     } 
     return NOT_CONNECTED; 
    } 
} 
+0

这不仅是工作,如果我杀了应用程序, –

+0

你能更新与完整的主要问题活动代码? – mallaudin

回答

0

不知何故,你可以注册一个BroadcastReceiver,它将获得连接的意图。不需要实现这样的逻辑。在您的应用程序接收

使用下面的过滤条件:

<intent-filter> 
    <action android:name="android.net.wifi.WIFI_STATE_CHANGED"/> 
    <action android:name="android.net.wifi.STATE_CHANGE"/> 
</intent-filter> 

按照以下职位:

BroadcastReceiver when wifi or 3g network state changed

希望它可以帮助..

+0

我在服务中注册它的原因是因为我想等手机获得wifi连接,所以即使应用程序被杀,我也可以上传一些东西 –

0

您可以使用意向的服务上传您的数据将从专用网络更改广播接收器调用,并且可能甚至点击提交按钮。

的服务看起来像:

public class UploadService extends IntentService { 
    @Override 
    protected void onHandleIntent(Intent workIntent) { 
     int networkState = NetworkUtil.getConnectionStatus(context); 
     DatabaseHandler db=new DatabaseHandler(context); 
     if(networkState == NetworkUtil.NOT_CONNECTED){ 
      internetAvailable = false; 
     } else if(networkState == NetworkUtil.MOBILE){ 
      internetAvailable = true; 
      //MainActivity.tvStatus.setText("ONLINE"); // you do something here. 
     } else if(networkState == NetworkUtil.WIFI){ 

      internetAvailable = true; 

      if(db.getReportsCount()!=0){ 
       reports=db.getAllReports(); 
       for(Report report : reports){ 
        Upload upload=new Upload(report); 
        Thread doInBackground = new Thread(upload); 
        doInBackground.start(); 
       } 

       db.deleteAll(); 
      } 
     } 
    } 

    public class Upload implements Runnable { 
     Report report; 
     public Upload(Report _report) 
     { 
      report=_report; 
     } 
     @Override 
     public void run() { 
      try { 
       MediaType MEDIA_TYPE_JPEG = MediaType.parse("image/jpeg"); 

       OkHttpClient client = new OkHttpClient.Builder() 
         .connectTimeout(30, TimeUnit.SECONDS) 
         .writeTimeout(120, TimeUnit.SECONDS) 
         .readTimeout(20, TimeUnit.SECONDS) 
         .build(); 

       MultipartBody.Builder mRequestBody = new MultipartBody.Builder().setType(MultipartBody.FORM); 

       mRequestBody.addFormDataPart("category", report.getCategory()); 
       mRequestBody.addFormDataPart("description", report.getDescription()); 
       mRequestBody.addFormDataPart("city", report.getCity()); 
       mRequestBody.addFormDataPart("address", report.getAddress()); 
       mRequestBody.addFormDataPart("datetime", report.getDateTime()); 
       mRequestBody.addFormDataPart("name", report.getName()); 
       mRequestBody.addFormDataPart("email", report.getEmail()); 
       mRequestBody.addFormDataPart("phone", report.getPhone()); 

       if(report.getImages()[0].trim().length()!=0) { 
        ArrayList<Uri> fileUris = new ArrayList<>(); 
        for (String uri : report.getImages()) 
        { 
         fileUris.add(Uri.parse(uri)); 
        } 

        for (Uri FileUri : fileUris) 
        { 
         File file = new File(FileUri.getPath()); 

         RequestBody imageBody = RequestBody.create(MEDIA_TYPE_JPEG, file); 
         mRequestBody.addFormDataPart("images[]", FileUri.getLastPathSegment(), imageBody); 
        } 
       } 
       RequestBody requestBody = mRequestBody.build(); 

       Request request = new Request.Builder() 
         .addHeader("Content-Type","text/json; Charset=UTF-8") 
         .header("Authorization", "Basic bWlsaW5nb25hOlN0") 
         .url("http://LINK.com") 
         .post(requestBody) 
         .build(); 

       Response response = client.newCall(request).execute(); 


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

      Thread.currentThread().interrupt(); 

      return; 
     } 

    } 
} 

您可以参考这里本正式文件:Creating a background service

+0

我也试过,我面对的唯一问题是当我杀了应用程序,服务重新启动,并完成任务,我不能让它停止 –

+0

停止意向服务不是必需的,它会在作业完成时自行停止。请参阅示例代码的更新答案。 –

+0

我刚刚尝试过,它不会工作,但回调函数如何处理onhandle intent –