2017-02-27 82 views
0

我编写了一个应用,该应用启动位置服务,服务获取使用意图的地址,并在位置在预定义半径之内和之外时弹出通知。 问题是当我试图摧毁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

该解决方案为我工作:

我从传递到服务的意向删除地址对象,它突然完美的工作。 我已经从Service中的sharedPreferences获得了我的Address对象。

相关问题