2017-07-01 10 views
1

私は、アプリが閉じられているときに実行したいバックグラウンドサービスを作成しようとしています。Androidサービスで位置情報サービスfusedlocationapiを使用する - 位置更新を1つだけ受信する

以下のコードでわかるように、onLocationChanged()で表示するはずのToastメッセージがあります。私はそのメッセージが一度しか見えないことを見ています。ここで

は許可がマニフェストで次のようになります。

<application 
... 

<activity android:name=".activities.ChatUsersActivity" /> 
    <activity android:name=".activities.RequestsActivity"></activity> 
    <service android:name=".pops.PopService" 
     android:exported="false" 
     android:icon="@drawable/usericonmdpi"/> 

</application> 

そしてまた、ここで私のサービスの拡張クラスがある:

public class PopService extends Service implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener { 

ScheduledThreadPoolExecutor threadPoolExecutor = new ScheduledThreadPoolExecutor(2); 
Runnable backgroundCollector = new BackgroundPopCollector(); 

private GoogleApiClient mGoogleApiClient; 
LocationRequest mLocationRequest; 
Location mLastLocation; 

private PopCityCollection cities; 

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



@Override 
public void onCreate() { 
    // Code to execute when the service is first created 
    super.onCreate(); 
    buildGoogleApiClient(); 

} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    threadPoolExecutor.shutdownNow(); 
} 

@Override 
public void onLocationChanged(Location location) { 
    if (mGoogleApiClient != null) { 
     LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); 
    } 
    UserLocation.setLatitude(location.getLatitude()); 
    UserLocation.setLongitude(location.getLongitude()); 
    Toast.makeText(getBaseContext(), "Latitude is " + location.getLatitude(), Toast.LENGTH_SHORT).show(); 
    System.out.println(UserLocation.getLatitude()+", "+UserLocation.getLongitude()+" --->BACKGROUND!!"); 
    if(cities==null) { 
     cities = new PopCityCollection(new LatLng(location.getLatitude(), location.getLongitude())); 
     cities.findMyCity(this); 
    } 
    DatabaseReference db = FirebaseDatabase.getInstance().getReference().child("pops"); 
    db.push().setValue("test"); 



} 


@Override 
public void onConnected(@Nullable Bundle bundle) { 
    mLocationRequest = new LocationRequest(); 

    mLocationRequest.setInterval(100); 
    mLocationRequest.setFastestInterval(100); 
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    if (ContextCompat.checkSelfPermission(this, 
      android.Manifest.permission.ACCESS_FINE_LOCATION) 
      == PackageManager.PERMISSION_GRANTED) { 
     LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
    } 

} 

@Override 
public void onConnectionSuspended(int i) { 

} 

@Override 
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 

} 

protected synchronized void buildGoogleApiClient() { 
    mGoogleApiClient = new GoogleApiClient.Builder(getApplicationContext()) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API) 
      .build(); 
    mGoogleApiClient.connect(); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId){ 
    threadPoolExecutor.scheduleAtFixedRate(backgroundCollector, 0, 10, TimeUnit.SECONDS); 
    return START_NOT_STICKY; 
} 

} 

はあなたが提供することができます任意の洞察力をありがとう!

-T

答えて

2
if (mGoogleApiClient != null) { 
     LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); 
    } 

上記条件は、最初の時間の後ので

removeLocationUpdates

このコードを削除する所定の位置のリスナーのすべての位置の更新を削除し、位置更新を削除します。

+1

あなたは素晴らしいです!早くて簡単。ありがとうございます! – TJBlack31

関連する問題