2016-10-20 4 views
-1

Привет, новый для разработки Android, что мне нужно, чтобы найти местоположение пользователя навсегда 15 минут и отправить на сервер, я узнал, что я могу сделать с помощью службы. После реализации, когда я очищаю приложение из недавней памяти, я прекращаю обновление, я прочитал и пробовал все решения, как я могу достичь этого, даже когда последнее приложение очищено, необходимо убедиться, что моя служба запущена и выборка из пользовательского местоположения позволяет мне опубликовать мой код обслуживания :Как запустить GPS в фоновом режиме навсегда 15 минут с помощью службы?

public class GPSService extends Service 
{ 
    private static final String TAG = "BOOMBOOMTESTGPS"; 
    private LocationManager mLocationManager = null; 
    private static final int LOCATION_INTERVAL = 10000; 
    private static final float LOCATION_DISTANCE = 0; 

    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 onTaskRemoved(Intent rootIntent){ 
       super.onTaskRemoved(rootIntent); 
     Intent restartService = new Intent(getApplicationContext(), 
       this.getClass()); 
     restartService.setPackage(getPackageName()); 
     PendingIntent restartServicePI = PendingIntent.getService(
       getApplicationContext(), 1, restartService, 
       PendingIntent.FLAG_ONE_SHOT); 
     AlarmManager alarmService = (AlarmManager)getApplicationContext().getSystemService(Context.ALARM_SERVICE); 
     alarmService.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() +1000, restartServicePI); 

    } 
    @Override 
    public void onDestroy() 
    { 
     Log.e(TAG, "onDestroy"); 
     super.onDestroy(); 
     Intent intent = new Intent("restartApps"); 
     sendBroadcast(intent); 
     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); 
     } 
    } 
} 

Мой радиовещательный приемник:

public class RestartService extends BroadcastReceiver { 

    private static final String TAG = "RestartService"; 

    public RestartService() { 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.e(TAG, "onReceive"); 
     context.startService(new Intent(context, GPSService.class)); 
    } 
} 

Мой манифест:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="precisioninfomatics.backgroundgps"> 

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 
    <application 
     android:name=".gspapp" 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity 
      android:name=".GPS" 
      android:label="@string/app_name" 
      android:theme="@style/AppTheme.NoActionBar"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

     <service 
      android:name=".MyLocationService" 
      android:exported="true" 
      android:permission="com.google.android.gms.permission.BIND_NETWORK_TASK_SERVICE" 
      android:stopWithTask="false"> 
      <intent-filter> 
       <action android:name="com.google.android.gms.gcm.ACTION_TASK_READY" /> 
      </intent-filter> 
     </service> 
     <service 
      android:name=".GPSService" 
      android:enabled="true" 
      android:stopWithTask="false" 
      android:exported="false" /> 
     <receiver 
      android:name=".RestartService" 
      android:enabled="true" > 
      <intent-filter> 
       <action android:name="restartApps" /> 
      </intent-filter> 
     </receiver> 
    </application> 

</manifest> 

мои проблемы:

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

Спасибо заранее

ответ

0

начала службы со службой START_STICKY, так что если он был убит из-за некоторого приоритета, чем он воссоздается, и если вы хотите постоянно запускать эту службу в фоновом режиме и WAKE_Lock, то эта служба и использование диспетчера Alarm Manager проверяют, что она запущена или нет.

0

Вы можете использовать AlarmManager для планирования вашего обслуживания. Что-то вроде:

AlarmManager alarm =(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
    Intent checkLocationIntent = new Intent(context, CheckLocationService.class); 

    PendingIntent pendingIntent = PendingIntent.getService(context, 0, checkLocationIntent, 0); 

    alarm.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, ALARM_INTERVAL_MILLISECONDS, 
      ALARM_INTERVAL_MILLISECONDS, pendingIntent); 

Это будет работать CheckLocationService каждый раз ALARM_INTERVAL_MILLISECONDS