2017-02-27 10 views
0

位置情報サービスを開始するアプリを作成し、Intentを使用してアドレスを取得し、その場所が事前定義された半径の内側と外側にあるときに通知をポップします。 問題は、私がMainAvtivityを破壊しようとしているときです。私はサービスが生き続けることを望むが、私がアプリケーションを破壊するとクラッシュする。位置情報サービスの実行中にAndroidアプリがonDestroyにクラッシュする

マイコード:

LocationService.java

public class LocationService extends Service { 

private LocationManager mLocationManager; 
private boolean inRange = false; 
private boolean isNotificationPosted = false; 
private DatabaseHelper db; 
private ReportItem item; 
private float lastKnownDistance; 
private Location chosenLocation; 

private static final long LOCATION_REFRESH_TIME = 10000; 
private static final float LOCATION_REFRESH_DISTANCE = 10; 
private static final int RADIUS = 100; 
private static final float INITIAL_DISTANCE = 1000; 

private LocationListener mLocationListener = new LocationListener() { 
    @Override 
    public void onLocationChanged(Location location) 
    { 
     float distance = location.distanceTo(chosenLocation); 

     if(!isNotificationPosted) 
     { 
      if (lastKnownDistance > distance) { 

       //Entering workplace radius 
       if (distance < RADIUS && !inRange) { 
        Log.i("Service", "in range with notification"); 

        inRange = true; 
        item = new ReportItem(); 
        makeNotification(); 
        isNotificationPosted = true; 

       } 
      } 
     } 

     else 
     { 
      if (lastKnownDistance < distance) { 

       //Leaving workplace radius 
       if (distance > RADIUS && inRange) { //out of range 
        Log.i("Service", "out of range with notification"); 

        inRange = false; 
        item.setExit(new Date()); 
        db.createReport(item); 
        makeNotification(); 
        isNotificationPosted = false; 
       } 
      } 
     } 

     lastKnownDistance = distance; 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) {} 
    @Override 
    public void onProviderEnabled(String provider) {} 
    @Override 
    public void onProviderDisabled(String provider) { 
     Toast.makeText(getApplicationContext(), "Please turn on your location services", Toast.LENGTH_SHORT).show(); 
    } 
}; 

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

@Override 
public int onStartCommand(final Intent intent, int flags, int startId) 
{ 
    mLocationManager = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE); 
    final Address chosenAddress = intent.getParcelableExtra("chosen address"); 
    chosenLocation = setLatLong(chosenAddress.getLongitude(), chosenAddress.getLatitude()); 
    lastKnownDistance = INITIAL_DISTANCE; 
    Log.i("Service", "lase known location, distance: " + Float.toString(lastKnownDistance)); 

    db = new DatabaseHelper(this); 

    ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION); 
    mLocationManager.requestLocationUpdates(
      LocationManager.GPS_PROVIDER, 
      LOCATION_REFRESH_TIME, 
      LOCATION_REFRESH_DISTANCE, 
      mLocationListener 
    ); 

    return START_STICKY; 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    db.close(); 
    ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION); 
    this.mLocationManager.removeUpdates(this.mLocationListener); 

} 

MainActivityからサービス開始:

serviceIntent = new Intent(MainActivity.this, LocationService.class); 
//selected address is from type Address 
serviceIntent.putExtra("chosen address", selectedAddress); 
saveIntentIntoSharedPreferences(serviceIntent); 
startService(serviceIntent); 

任意のアイデア何の問題を引き起こす可能性がありますか?

ありがとうございました!

+0

エラーログを投稿してください! – Kaushal28

答えて

0

このソリューションは、私の仕事:

を私がサービスに配信し、それが突然、完全に働い意図からAddressオブジェクトを削除しました。 サービス内のsharedPreferencesから自分のAddressオブジェクトを取得しました。

関連する問題