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);
任意のアイデア何の問題を引き起こす可能性がありますか?
ありがとうございました!
エラーログを投稿してください! – Kaushal28