2017-01-17 9 views
0

Мне нужно постоянно запускать службу, пока мое приложение не будет удалено. В этой службе мне нужно отправить lat длинные значения непрерывно на каждую минМне нужно постоянно отправлять значения lat long на сервер в определенный промежуток времени, но моя служба работает неправильно в фоновом режиме

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

моей активности ......... .

Позвонил мне с помощью диспетчера аварийных сигналов

public void SrartService() { 

     AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
     Intent alarmIntent = new Intent(MAinActivity.this, BootReciver.class); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(MAinActivity.this, 7, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
     Calendar StartTime = Calendar.getInstance(); 
     Log.d("trackin", "tracking here"); 
     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, StartTime.getTimeInMillis(), 1000 * 60 * 60, pendingIntent); 

} 

....... мой BootReciver

public void onReceive(Context context, Intent intent) { 
     ... 
    context.startService(new Intent(context,LongService.class)); 
..} 

Мои LongService ................

@Override 
    public void onCreate() { 
     // TODO Auto-generated method stub 
     super.onCreate(); 
     Log.d("first launch", "first oncreate launch"); 
     dbHandler = new DbHandler(LongService.this); 
     buildGoogleApiClient(); 
     createLocationRequest(); 
    } 

    @Override 
    public IBinder onBind(Intent arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 


    @Override 
    public void onDestroy() { 
     // TODO Auto-generated method stub 
     Toast.makeText(getBaseContext(), "KiteEye Tracking is Destroyed Please Open it Again ", Toast.LENGTH_SHORT).show(); 
     super.onDestroy(); 
    } 

    @Override 
    public void onTaskRemoved(Intent rootIntent) { 
     super.onTaskRemoved(rootIntent); 
    } 

    @Override 
    public void onStart(Intent intent, int startId) { 
     // TODO Auto-generated method stub 
     super.onStart(intent, startId); 


     SharedPreferences bb = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE); 
     Saved_Vehicle_ID = bb.getString("VehicleId", ""); 
     VehicleName = bb.getString("VehicleName", ""); 
     handler.postDelayed(new Runnable() { 
      public void run() { 
       Count = Count + 1; 
       insertDB(str1, str2, date); 
       if (isConnectingToInternet(LongService.this)) { 
        SendOfflineLatLongToServer(); 
       } 
       Log.e(TAG, "count" + Count); 
       Log.e(TAG, "(running.!!!!!!!)" + Saved_Vehicle_ID + Saved_interval); 
       Log.e(TAG, "(Cuurent location.!!!!!!!)" + Current_Address + Saved_interval); 

       if (Count >=60) { 
        Log.e(TAG, "count reached to Maximum "); 
        if(Current_Address!=null) { 
         if (date1 != null) { 
          sendMessageToActivity(getApplicationContext(), Current_Address, date1); 
          KeyguardManager km = (KeyguardManager) getApplicationContext() 
            .getSystemService(Context.KEYGUARD_SERVICE); 
          final KeyguardManager.KeyguardLock kl = km 
            .newKeyguardLock("MyKeyguardLock"); 
          kl.disableKeyguard(); 
          PowerManager pm = (PowerManager) getApplicationContext() 
            .getSystemService(Context.POWER_SERVICE); 
          PowerManager.WakeLock wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK 
            | PowerManager.ACQUIRE_CAUSES_WAKEUP 
            | PowerManager.ON_AFTER_RELEASE, "MyWakeLock"); 
          wakeLock.acquire(); 
          Count = 0; 
         } 
        } 
       } 
       sendMessageToActivity(getApplicationContext(), Current_Address, date1); 
       handler.postDelayed(this, 60000); 
      } 
     }, 60000); 
    } 

    private static void sendMessageToActivity(Context context, String loc, String time) { 
     Intent intent = new Intent("CurrentLocation"); 
     Bundle b = new Bundle(); 
     b.putString("Location", loc); 
     b.putString("Time", time); 
     intent.putExtra("Location", b); 
     intent.putExtra("Time", b); 
     LocalBroadcastManager.getInstance(context).sendBroadcast(intent); 
    } 

    private void insertDB(String str1, String str2, String date) { 
     ... 
    } 

    String S_id, S_lat, S_lon, S_time; 

    private void SendOfflineLatLongToServer() { 
     ... 
    } 

    public void SendLatLongToServer(final String _mid, final String lat, final String lon, final String time) { 
     ... 

    } 

    public static boolean isConnectingToInternet(Context _context) { 
     ..... 
    } 

    public synchronized void buildGoogleApiClient() { 
     ... 
    } 

    /** 
    * Creating location request object 
    */ 
    public void createLocationRequest() { 
     .. 
    } 

    protected void startLocationUpdates() { 

     .. 
    } 

    /** 
    * Stopping location updates 
    */ 
    protected void stopLocationUpdates() { 
     LocationServices.FusedLocationApi.removeLocationUpdates(
       mGoogleApiClient, this); 
    } 

    /** 
    * Google api callback methods 
    */ 
    @Override 
    public void onConnectionFailed(ConnectionResult result) { 
     Log.i(TAG, "Connection failed: ConnectionResult.getErrorCode() = " 
       + result.getErrorCode()); 
    } 

    @Override 
    public void onConnected(Bundle arg0) { 

     .. 
    } 

    @Override 
    public void onConnectionSuspended(int arg0) { 
     mGoogleApiClient.connect(); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     // Assign the new location 
     mLastLocation = location; 
     // Displaying the new location on UI 
     displayLocation(); 


    } 

    private void displayLocation() { 
     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      // TODO: Consider calling 
      // ActivityCompat#requestPermissions 
      // here to request the missing permissions, and then overriding 
      // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
      //           int[] grantResults) 
      // to handle the case where the user grants the permission. See the documentation 
      // for ActivityCompat#requestPermissions for more details. 
      return; 
     } 
     mLastLocation = LocationServices.FusedLocationApi 
       .getLastLocation(mGoogleApiClient); 
     if (mLastLocation != null) { 
      double latitude = mLastLocation.getLatitude(); 
      double longitude = mLastLocation.getLongitude(); 
      Geocoder geocoder; 
      List<Address> addresses; 
      geocoder = new Geocoder(this, Locale.getDefault()); 
      try { 
       addresses = geocoder.getFromLocation(latitude, longitude, 7); 
       if (addresses != null) { 
        String address = addresses.get(0).getAddressLine(0); 
        String address1 = addresses.get(0).getSubLocality(); 
        String address2 = addresses.get(0).getLocality(); 
        StringBuilder stringBuilder = new StringBuilder(); 
        stringBuilder.append(address); 
        stringBuilder.append(","); 
        stringBuilder.append(address1); 
        stringBuilder.append(","); 
        stringBuilder.append(address2); 
        Current_Address = stringBuilder.toString(); 

       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      str1 = String.valueOf(latitude); 
      str2 = String.valueOf(longitude); 

      DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
      Date CuurentTime = new Date(mLastLocation.getTime()); 
      date = format.format(CuurentTime); 

      DateFormat format1 = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); 
      Date CuurentTime1 = new Date(mLastLocation.getTime()); 
      date1 = format1.format(CuurentTime1); 
      Log.d(TAG, "location" + str1 + "\t" + str2); 
      Log.d(TAG, "location" + "date and time" + date); 

      app_preferences = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE); 
      editor = app_preferences.edit(); 
      editor.putString("date", date); 
      editor.putString("CurrentAddress", Current_Address); 
      editor.commit(); 


      MyApplication.getInstance().getPrefManager().setTime(date); 
      MyApplication.getInstance().getPrefManager().setCurrentLocation(Current_Address); 
//   if (Count==0) { 
//    sendMessageToActivity(getApplicationContext(), Current_Address, date); 
//   } 
     } else { 
      Log.e(TAG, "(Couldn't get the location. Make sure location is enabled on the device)"); 
     } 
    } 
    private void displayLocation1() { 
     if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      // TODO: Consider calling 
      // ActivityCompat#requestPermissions 
      // here to request the missing permissions, and then overriding 
      // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
      //           int[] grantResults) 
      // to handle the case where the user grants the permission. See the documentation 
      // for ActivityCompat#requestPermissions for more details. 
      return; 
     } 
     mLastLocation = LocationServices.FusedLocationApi 
       .getLastLocation(mGoogleApiClient); 
     if (mLastLocation != null) { 
      double latitude = mLastLocation.getLatitude(); 
      double longitude = mLastLocation.getLongitude(); 
      str1 = String.valueOf(latitude); 
      str2 = String.valueOf(longitude); 
      DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
      Date CuurentTime = new Date(mLastLocation.getTime()); 
      date = format.format(CuurentTime); 
      Log.d(TAG, "loc" + str1 + "\t" + str2); 
      Log.d(TAG, "loc" + "date & time" + date); 
      insertDB(str1, str2, date); 

     } else { 
      Log.e(TAG, "(Couldn't get the location. Make sure location is enabled on the device)"); 
     } 
    } 
    public void removeDB(String id) { 
    ... 
} 
+0

тестирование на устройстве samsung? –

+0

вы уверены, что он работает в течение нескольких дней, а затем он остановился? @Divya –

+0

Да, я уверен, что он работает в течение нескольких дней службы разрушает – Divya

ответ

0

Как отметил @PratikDasa , Android может время от времени удалять длинные фоновые сервисы для восстановления системных ресурсов. Поэтому, если вам нужно постоянно запускать службу в фоновом режиме, выполните метод onStartCommand. Вырезать полный код из вашего текущего метода onStart и положить в onStartCommand (OnStart был устаревшим давно). onStartCommand должен вернуть значение, и это трюк. Возвратите START_STICKY от этого. Вы можете прочитать больше об этой константе в Android Service API

При возврате START_STICKY из onStartCommand, вы в основном спросить Android систему явно перезапустить службу после того, как каждый раз, когда он останавливается. Теперь есть несколько предостережений, которые вы можете прочитать по приведенной выше ссылке. Самое главное среди всех предостережений заключается в том, что, когда система явно перезапускает вашу службу, поставленное намерение может быть NULL (если только нет намерения, ожидающего начала службы), и поэтому вы должны соответствующим образом обрабатывать их в своем коде.

Внесите эти изменения и выполните базовые испытания. Я надеюсь, что все должно работать нормально.

+0

tq fr ur [email protected] попытается решить мою проблему с помощью этих знаний. – Divya

+0

его хорошо @Divya вы можете спросить меня в любое время без колебаний. Вы можете связаться со мной по моему идентификатору электронной почты, если хотите. –

+0

Если вышеупомянутое решение работает для вас, сделайте это как ответ здесь для будущих ссылок для товарищей SO товарищей – Dibzmania

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

  • Нет связанных вопросов^_^