2016-10-19 3 views
-3

Мне нужно создать функциональность, в которой приложение проверяет местоположение пользователя каждый час (когда приложение не работает), и если местоположение в это время находится на расстоянии 100 миль или больше от предыдущего записанного местоположения , затем сделайте api-звонок для обновления местоположения пользователя в бэкэнд. Это, конечно, с учетом минимизации потребления батареи/мощности.Проверка местоположения каждый час в фоновом режиме

Я никогда не работал с непрерывными работами. Каков наилучший подход для достижения этого?

+0

Я думаю, что вы не не читать или попробовать что-нибудь .................. .... о менеджере местоположений, если вы это сделаете, то вы не задаете этот вопрос, потому что ... одна простая строка в этом коде - «LocationManager.requestLocationUpdates (LocationManager.GPS_PROVIDER, GPS_TIME_INTERVAL, GPS_DISTANCE, GPSListener); –

+0

@GaneshPokale Я работал с менеджером местоположений в поиске местоположения пользователя для другой части этого приложения. Часть, о которой я действительно спрашиваю, заключается в том, как это делать каждый час, когда приложение не работает. – yellowmonkey

+0

Создайте службу, которая работает в фоновом режиме на устройстве, диспетчер местоположения звонков, чтобы запросить обновление с помощью набора GPS_TIME_INTERVAL в течение 1 часа в рамках этой услуги? Я несколько понимаю поток и концепцию. Я задаю этот вопрос, чтобы узнать, какой лучший подход будет, поскольку я никогда не работал с фоновыми службами, когда приложение не работает – yellowmonkey

ответ

2
public class MyService extends Service 
{ 
private static final String TAG = "BOOMBOOMTESTGPS"; 
private LocationManager mLocationManager = null; 
private static final int LOCATION_INTERVAL = 1000 * 60 * 60; // 1 hour 
private static final float LOCATION_DISTANCE = 160935f; // 100 miles 

private class LocationListener implements android.location.LocationListener 
    { 
    Location mLastLocation; 

    public LocationListener(String provider) 
    { 
     Log.e(TAG, "LocationListener " + provider); 
     mLastLocation = new Location(provider); 
    } 

    @Override 
    public void onLocationChanged(Location location) 
    { 
     Log.e(TAG, "onLocationChanged: " + location); 
     mLastLocation.set(location); 
    } 

    @Override 
    public void onProviderDisabled(String provider) 
    { 
     Log.e(TAG, "onProviderDisabled: " + provider); 
    } 

    @Override 
    public void onProviderEnabled(String provider) 
    { 
     Log.e(TAG, "onProviderEnabled: " + provider); 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) 
    { 
     Log.e(TAG, "onStatusChanged: " + provider); 
    } 
} 

LocationListener[] mLocationListeners = new LocationListener[] { 
     new LocationListener(LocationManager.GPS_PROVIDER), 
     new LocationListener(LocationManager.NETWORK_PROVIDER) 
}; 

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

@Override 
public int onStartCommand(Intent intent, int flags, int startId) 
{ 
    Log.e(TAG, "onStartCommand"); 
    super.onStartCommand(intent, flags, startId); 
    return START_STICKY; 
} 

@Override 
public void onCreate() 
{ 
    Log.e(TAG, "onCreate"); 
    initializeLocationManager(); 
    try { 
     mLocationManager.requestLocationUpdates(
       LocationManager.NETWORK_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE, 
       mLocationListeners[1]); 
    } catch (java.lang.SecurityException ex) { 
     Log.i(TAG, "fail to request location update, ignore", ex); 
    } catch (IllegalArgumentException ex) { 
     Log.d(TAG, "network provider does not exist, " + ex.getMessage()); 
    } 
    try { 
     mLocationManager.requestLocationUpdates(
       LocationManager.GPS_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE, 
       mLocationListeners[0]); 
    } catch (java.lang.SecurityException ex) { 
     Log.i(TAG, "fail to request location update, ignore", ex); 
    } catch (IllegalArgumentException ex) { 
     Log.d(TAG, "gps provider does not exist " + ex.getMessage()); 
    } 
} 

@Override 
public void onDestroy() 
{ 
    Log.e(TAG, "onDestroy"); 
    super.onDestroy(); 
    if (mLocationManager != null) { 
     for (int i = 0; i < mLocationListeners.length; i++) { 
      try { 
       mLocationManager.removeUpdates(mLocationListeners[i]); 
      } catch (Exception ex) { 
       Log.i(TAG, "fail to remove location listners, ignore", ex); 
      } 
     } 
    } 
} 

private void initializeLocationManager() { 
    Log.e(TAG, "initializeLocationManager"); 
    if (mLocationManager == null) { 
     mLocationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE); 
    } 
} 
} 

Ваш AndroidManifest.xml будет выглядеть примерно так:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <activity android:label="@string/app_name" android:name=".LocationCheckerActivity" > 
     <intent-filter > 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <service android:name=".MyService" android:process=":my_service" /> 
</application> 
+0

Я действительно не ожидал, что кто-нибудь предоставит мне весь код, я надеялся узнать лучший подход к этому. Спасибо Ганешу в любом случае, очень полезно – yellowmonkey

+0

Счастливое кодирование :) –

+0

У этого всегда есть менеджер местоположений? Как насчет этого подхода? Внутри OnCreate – yellowmonkey

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

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