2

많은 활동에서 사용자의 현재 위치를 사용해야하는 앱을 만들고 있습니다. 모든 활동에 위치 클라이언트를 구현하고 싶지는 않습니다. 내 앱에서 현재 위치를 사용하는 가장 좋은 방법은 무엇입니까? 백그라운드 서비스일까요? 만약 그렇다면 어떻게 사용할 수 있습니까? 어떤예요? 코드 아래많은 Android 활동에서 현재 위치 사용

답변

2

첫째, 인 Hemant 찬드 "로 대답 Dungriyal "이 잘못되었습니다. 클래스는 Service에서 상속 받지만 서비스 구성 요소에서 제공하는 기능을 사용하지 않으므로 기본적으로 일반 클래스 일뿐 아니라 "서비스 확장"부분도 제거 할 수 있습니다! (분명히 나는 ​​주석을 달아 평판을 얻지 못한다.)

전반적으로 각 클라이언트가 자신의 필요에 맞는 위치를 요청할 수있는 방법으로 안드로이드에서 LocationProvider 서비스에 대한 자신의 연결을 관리하는 것이 더 좋습니다. 예를 들어 액티비티가 거친 위치 만 필요로하고 시스템에서 마지막으로 알려진 위치를 필요로하는 다른 위치 대 괜찮은 위치를 필요로하는 다른 위치를 원한다면 모든 위치에 정밀한 위치를 부여하여 시스템 리소스를 낭비하지 않아도됩니다.

하지만 앱의 모든 부분에서 정확한 위치가 필요하다는 것을 알고 있다면 서비스를 사용하는 것이 하나의 옵션입니다. 그러나 서비스의 수명주기를 관리해야합니다 (서비스를 바운드 할 것인지, 언제 서비스를 시작 할 것인지, 언제 생성하고 언제 파기해야합니까? 등). 또한 모든 활동이 닫히고 안전 할 때를 알아야합니다. 서비스를 종료합니다.

대안은 응용 프로그램 클래스에서 코드를 구현하는 것입니다. 첫 번째 액티비티가 액티비티에 액세스해야 할 때 초기화 할 수 있으며, 모든 액티비티가 닫히면 종료 할 수 있습니다 (위치를 알아야하는 보이는 액티비티가 여전히 있는지 알아내는 메커니즘이 필요함).

구현 예에서 Google을 매우 많이 찾을 수있을 것이라고 확신합니다. 당신은 Play 스토어의 외부를 게시하는 경우 http://developer.android.com/training/location/receive-location-updates.html

, 당신은 (안드로이드에서 이전 위치 서비스를 사용할 수 있습니다

+0

내 생각은 정확하게. – NickT

1

사용은 위도 긴 현재 위치를 얻을 : -

당신이 코드 아래에 위도와 긴 통화를하고 싶지
import android.app.Service; 
import android.content.Context; 
import android.content.Intent; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.os.IBinder; 

public class GPSTracker extends Service implements LocationListener 
{ 

    private final Context mContext; 

    // flag for GPS status 
    boolean isGPSEnabled = false; 

    // flag for network status 
    boolean isNetworkEnabled = false; 

    boolean canGetLocation = false; 

    Location location; // location 
    public static double latitude; // latitude 
    public static double longitude; // longitude 

    // The minimum distance to change Updates in meters 
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters 

    // The minimum time between updates in milliseconds 
    private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute 

    // Declaring a Location Manager 
    protected LocationManager locationManager; 

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

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

      // getting GPS status 
      isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 

      // getting network status 
      isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 

      if (!isGPSEnabled && !isNetworkEnabled) 
      { 
       // no network provider is enabled 
      } 
      else 
      { 
       this.canGetLocation = true; 
       // First get location from Network Provider 
       if (isNetworkEnabled) 
       { 
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 
          MIN_TIME_BW_UPDATES,MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
//     Log.d("Network", "Network"); 
        if (locationManager != null) 
        { 
         location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
         if (location != null) 
         { 
          latitude = location.getLatitude(); 
          longitude = location.getLongitude(); 
//       System.out.println("latitude if (isNetworkEnabled) => "+latitude); 
//       System.out.println("longitude if (isNetworkEnabled) => "+longitude); 
         } 
        } 
       } 
       // if GPS Enabled get lat/long using GPS Services 
       if (isGPSEnabled) 
       { 
        if (location == null) 
        { 
         locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
           MIN_TIME_BW_UPDATES,MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
//      Log.d("GPS Enabled", "GPS Enabled"); 
         if (locationManager != null) 
         { 
          location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); 
          if (location != null) 
          { 
           latitude = location.getLatitude(); 
           longitude = location.getLongitude(); 
//        System.out.println("latitude if (isGPSEnabled) => "+latitude); 
//        System.out.println("longitude if (isGPSEnabled) => "+longitude); 
          } 
         } 
        } 
       } 
      } 

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

     return location; 
    } 

    @Override 
    public void onLocationChanged(Location location) 
    { 
    } 

    @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; 
    } 
} 

: -

new GPSTracker(Activity.this); 
double latitude = GPSTracker.latitude; // latitude 
double longitude = GPSTracker.latitude; // latitude 
+1

이것은 각 활동에서 새 클래스를 인스턴스화하여 서비스를 사용하는 방법이 아니므로 대신 IBinder를 사용해야합니다. 또한 onLocationChanged에 코드를 삽입하지 않은 경우 마지막으로 알려진 위치는 null이됩니다. 이것은 두려운 대답입니다. -1 – NickT

0

내가 구글 Play 서비스 사용이 예제를 다음 다음 결과 FragmentActivity에서 위치를 필요로하는 활동을 확장하는 것이 좋습니다 또는이를 활용하는 라이브러리)를 사용하고 응용 프로그램에서 수행하는 것이 가능하지만 기본 Activity 클래스는 간단하며 수명주기 관리를보다 명확하게하고 위치 코드를 분류합니다.

+0

다중 활동에 대한이 접근법은 다른 활동에서 동일한 코드를 여러 번 실행하는 것을 의미하지 않습니까? – techtinkerer

관련 문제