2015-11-02 2 views
0

мое приложение не отправляет строку JSON скрипту PHP, когда приложение скрыто или экран выключен. Я использую HttpURLConnection. Мое приложение отправляет GPS-позицию. Я бы хотел, чтобы это приложение работало в backgeround как messanger. Отправка и получение данных происходит в AsyncTask. Что не так?Как отправлять и получать данные, когда приложение скрыто?

public class MyAsyncTask extends AsyncTask<JSONObject, Void, JSONObject> { 

    String addr = GlobalConfig.addr; 
    String prot = GlobalConfig.prot; 
    int port = GlobalConfig.port; 

    @Override 
    protected void onPreExecute() { 

    } 

    @Override 
    protected JSONObject doInBackground(JSONObject... params) { 

     JSONObject json = params[0]; 
     String string = "json="+json; 

     try { 

      URL url = new URL(prot,addr,port,"json/myLocation.php"); 

      HttpURLConnection httpCon = (HttpURLConnection) url.openConnection(); 
      httpCon.setDoOutput(true); 
      httpCon.setDoInput(true); 
      httpCon.setUseCaches(false); 
      httpCon.setConnectTimeout(15000); 
      httpCon.setRequestProperty("Content-Length", Integer.toString(string.length())); 
      httpCon.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
      httpCon.setRequestMethod("POST"); 

      DataOutputStream wr = new DataOutputStream(httpCon.getOutputStream()); 
      wr.writeBytes(string); 
      wr.flush(); 
      wr.close(); 

      int responseCode = httpCon.getResponseCode(); 

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

     return null; 

    } 

    @Override 
    protected void onPostExecute(JSONObject json) { 

    } 

} 


public class GPSTracker extends Service implements LocationListener { 

    private final Context mContext; 

    boolean isGPSEnabled = false; 

    boolean isNetworkEnabled = false; 

    boolean canGetLocation = false; 

    Location location; 
    double latitude; 
    double longitude; 

    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; 

    private static final long MIN_TIME_BW_UPDATES = 10000; 

    protected LocationManager locationManager; 

    public GPSTracker(Context context) { 
     this.mContext = context; 
     getLocation(); 
    } 

    public Location getLocation() { 
     try { 
      locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE); 

      isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 

      isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 

      if (!isGPSEnabled && !isNetworkEnabled) { 

      } else { 
       this.canGetLocation = true; 

       if (isNetworkEnabled) { 
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 
          MIN_TIME_BW_UPDATES, 
          MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 

        if (locationManager != null) { 
         location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
         if (location != null) { 
          latitude = location.getLatitude(); 
          longitude = location.getLongitude(); 
         } 
        } 
       } 

       if (isGPSEnabled) { 
        if (location == null) { 
         locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
           MIN_TIME_BW_UPDATES, 
           MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 

         if (locationManager != null) { 
          location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
          if (location != null) { 
           latitude = location.getLatitude(); 
           longitude = location.getLongitude(); 
          } 
         } 
        } 
       } 
      } 

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

     return location; 
    } 


    public void stopUsingGPS(){ 
     if(locationManager != null){ 
      locationManager.removeUpdates(GPSTracker.this); 
     } 
    } 


    public double getLatitude(){ 
     if(location != null){ 
      latitude = location.getLatitude(); 
     } 

     return latitude; 
    } 


    public double getLongitude(){ 
     if(location != null){ 
      longitude = location.getLongitude(); 
     } 

     return longitude; 
    } 


    public boolean canGetLocation() { 
     return this.canGetLocation; 
    } 


    public void showSettingsAlert(){ 
     AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext); 

     alertDialog.setTitle("GPS is settings"); 

     alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?"); 

     alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog,int which) { 
       Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
       mContext.startActivity(intent); 
      } 
     }); 

     alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       dialog.cancel(); 
      } 
     }); 

     alertDialog.show(); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 

     int ID = GlobalConfig.ID; 
     int Random = GlobalConfig.Random; 

     double latitude = location.getLatitude(); 
     double longitude = location.getLongitude(); 

     try { 

      JSONObject json = new JSONObject(); 
      json.put("ID", ID); 
      json.put("Random", Random); 
      json.put("latitude", latitude); 
      json.put("longitude", longitude); 

      new MyAsyncTask().execute(json); 

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

    } 

    @Override 
    public void onProviderDisabled(String provider) { 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
    } 

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

} 

Нравится?

+0

Пожалуйста, внесите свой код и оформите ваш вопрос еще – therealprashant

ответ

1

Я думаю, вы смешиваете разные вещи:

AsyncTask означает, что код выполняется в отдельной задаче (нити), но до сих пор в контексте вашей деятельности. Это означает, что он работает в фоновом режиме вашего приложения и не останавливает выполнение вашего приложения.

Служба может выполнять код в фоновом режиме без какого-либо контекста активности. Это похоже на систему.

Для достижения того, что вы хотите, вы должны поставить свои задачи в Службу.

0

Как и в случае с христианским, вам понадобится служба, если вы хотите обновить координаты, когда приложение находится в фоновом режиме.

Служба будет внедрять приемник местоположения, когда местоположение будет обновлено, вы запустите асинтет.

+0

Я обновил сообщение. Мой код включает службу, с которой вы пишете, и тем не менее она не отправляет данные. GPSTracker - это serivce. Когда местоположение изменяется, JSONObject переходит на AsyncTask. – SeaDog

+0

@SeaDog вы добавили сервис в файл манифеста? – meda

+0

Я забыл об этом, но если мой код верен? – SeaDog

0

Вам нужно сочетание вещей, чтобы сделать эту работу.

Прежде всего, вам нужно взглянуть на то, чтобы сделать ваш сервис липким. Чтобы сделать это, выполните следующие действия здесь:

Android Service needs to run always (Never pause or stop)

Липкий это служба, которая работает, пока вы явно не сказать ему, чтобы закрыть (http://developer.android.com/reference/android/app/Service.html#START_STICKY)

Вы также хотите посмотреть на wakefulBroadcastReceiver согласно документация: https://developer.android.com/reference/android/support/v4/content/WakefulBroadcastReceiver.html

Это происходит так, что когда устройство перезагружается или воспитывается после выключения, оно снова запускает вашу службу.

Для большей безопасности, вы также должны взглянуть на реализацию той или иной форме network broadcast receiver, например, путем внедрения решения здесь: Broadcast receiver for checking internet connection in android app

Это последняя так, что вы не пытаетесь отправить вещи когда нет сетевого подключения, и вместо этого вы запускаете свою услугу, когда устройство снова подключено к сети.

Тем не менее, я предлагаю вам проявлять осторожность при этом. Ваш всегда работающий, всегда загружающий сервис будет потреблять много энергии, и, возможно, вы хотите ограничить объем отправляемых данных и интервал, который он собирает, но это зависит от вас, чтобы слушать или нет :).

Смежные вопросы