2

Я делаю приложение, которое посылает координаты широты и долготы, поэтому я расширяю службу и внедряю LocationManager. Это часть моего кода:Android: лучшая практика для реализации LocationManager

public class LocationServiceTracking extends Service implements LocationListener{ 
 
.... 
 
@Override 
 
    public void onCreate() { 
 
     super.onCreate(); 
 
     mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
 

 
      if (isGPSEnabled && provider.equals(LocationManager.GPS_PROVIDER)) { 
 
       try { 
 
        mLocationManager.requestLocationUpdates(3000, 0, criteria, this, null); 
 
        Log.d("GPS Enabled", "GPS Enabled"); 
 
       } catch (SecurityException se) { 
 
        se.printStackTrace(); 
 
        Crashlytics.logException(se); 
 
       } 
 
      } 
 
    } 
 

 

 
    @Override 
 
    public int onStartCommand(Intent intent, int flags, int startId) { 
 
     return START_STICKY; 
 
    } 
 

 
}

Мой вопрос ¿Что будет лучшая практика, чтобы сделать это, если вы делаете это в onCreate() как сейчас или изменить его на onStartCommand()?

ответ

1

Используйте плавленое место апите для краткости.

О вашем вопросе - лучше сделать это в onCreate(), потому что onStartCommand() будет вызываться столько раз, сколько вы запускали запуск службы и onCreate только тогда, когда сервис действительно создан.

Calling start service

Service lifecycle

0

Это должно быть в onStartCommand()

Причина: onCreate() будет вызываться всякий раз, когда служба создается Но onStartCommand() будет вызываться, когда вы вручную запустить услуга по телефону obj.startService().

Так что если вы разместите этот код в onCreate(), вы начнете получать обновления ДО того, как вы начнете службу, которая не является хорошей практикой. Код, указанный в Service, должен быть включен только в том случае, если он установлен начато или связано.

См., Например,

MyService serviceObj = new MyService(); // this will call onCreate(). 

serviceObj.startService(); // this will call `onStartCommand()`. 

serviceObj.bindService(); // this will call onBind(). (Not your case). 

Надеюсь, это поможет.

0

Создайте поле в своем классе под названием mGoogleApiClient.

Тогда в onCreate сделать это:

// Create an instance of GoogleAPIClient. 
if (mGoogleApiClient == null) { 
    mGoogleApiClient = new GoogleApiClient.Builder(getActivity()) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API) 
      .build(); 
} 

Когда нагрузки класса и останавливается, обрабатывать жизненный цикл этой области:

public void onStart() { 
    mGoogleApiClient.connect(); 
    super.onStart(); 
} 

public void onStop() { 
    mGoogleApiClient.disconnect(); 
    super.onStop(); 
} 

Теперь Реализовать folliwing интерфейсы:

GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener 

и добавьте их методы:

@Override 
public void onConnected(Bundle connectionHint) { 
    Log.d(TAG, "Google Maps API::onConnected"); 
    //For Marshmallow 6.0, make sure to check Permissions 
    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
} 

@Override 
public void onConnectionSuspended(int i) { 
    Log.d(TAG, "Google Maps API::onConnectionSuspended"); 
} 

@Override 
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 
    Log.d(TAG, "Google Maps API::onConnectionFailed"); 
} 
Смежные вопросы