退出应用程序后,后台服务中的位置更新无效

时间:2013-10-07 06:40:58

标签: android geolocation android-service locationmanager

我已经实现了一个服务,它在后台更新位置,当使用后退键存在应用程序时,Android应用程序无法正常工作(崩溃)。以下是代码。

public class LocationService extends Service
{
private static final String TAG = "Location";
private LocationManager mLocationManager = null;
private static final int LOCATION_INTERVAL = 0;
private static final float LOCATION_DISTANCE = 0f;
private static Context mContext;
private static int messageCount;

private class LocationListener implements android.location.LocationListener{
    Location mLastLocation;
    public LocationListener(String provider)
        {
        mContext = (Context)LocationDetails.locationContext;
        Log.e(TAG, "LocationListener " + provider);
        mLastLocation = new Location(provider);
    }


@SuppressWarnings("deprecation")
@Override
public void onLocationChanged(Location location)
{
    try
    {
        messageCount++;
        Log.e(TAG, "onLocationChanged: " + location);
        mLastLocation.set(location); 
        NotificationManager nm = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);   
        Notification notification = new Notification(R.drawable.ic_launcher, "Text", System.currentTimeMillis());
        Intent intentTL = new Intent(mContext, LocationDetails.class);

        notification.setLatestEventInfo(mContext, "Title", String.valueOf(location.getLatitude()),               
        PendingIntent.getActivity(mContext, 0, intentTL, PendingIntent.FLAG_CANCEL_CURRENT));


        notification.flags |= Notification.FLAG_AUTO_CANCEL; 
        notification.defaults |= Notification.DEFAULT_SOUND; 
        notification.defaults |= Notification.DEFAULT_VIBRATE;
        notification.number += messageCount;
        nm.notify(messageCount, notification);
    }
    catch(Exception error)
    {
        System.out.println(error.getMessage());
    }
}
@Override
public void onProviderDisabled(String provider)
{
    Log.e(TAG, "onProviderDisabled: " + provider);            
}
@Override
public void onProviderEnabled(String provider)
{
    Log.e(TAG, "onProviderEnabled: " + provider);
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras)
{
    Log.e(TAG, "onStatusChanged: " + provider);
}
} 
public class ServiceBinder extends Binder {
    LocationService getService()
    {
        return LocationService.this;
    }
}

LocationListener[] mLocationListeners = new LocationListener[] {
    new LocationListener(LocationManager.GPS_PROVIDER),
    new LocationListener(LocationManager.NETWORK_PROVIDER)
};
@Override
public IBinder onBind(Intent arg0)
{
    return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId)
{    
    Log.e(TAG, "onStartCommand");
    super.onStartCommand(intent, flags, startId);       
    return START_STICKY;
}
@Override
public void onCreate()
{
    mContext = (Context)LocationDetails.locationContext;
    Log.e(TAG, "onCreate");
    initializeLocationManager();
    try {
        mLocationManager.requestLocationUpdates(
                LocationManager.NETWORK_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE,
                mLocationListeners[1]);
    } catch (java.lang.SecurityException ex) {
        Log.i(TAG, "fail to request location update, ignore", ex);
    } catch (IllegalArgumentException ex) {
        Log.d(TAG, "network provider does not exist, " + ex.getMessage());
    }
    try {
        mLocationManager.requestLocationUpdates(
                LocationManager.GPS_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE,
                mLocationListeners[0]);
    } catch (java.lang.SecurityException ex) {
        Log.i(TAG, "fail to request location update, ignore", ex);
    } catch (IllegalArgumentException ex) {
        Log.d(TAG, "gps provider does not exist " + ex.getMessage());
    }
}
@Override
public void onDestroy()
{
    Log.e(TAG, "onDestroy");
    super.onDestroy();
    if (mLocationManager != null) {
        for (int i = 0; i < mLocationListeners.length; i++) {
            try {
                mLocationManager.removeUpdates(mLocationListeners[i]);
            } catch (Exception ex) {
                Log.i(TAG, "fail to remove location listners, ignore", ex);
            }
        }
}
} 
private void initializeLocationManager() {
    Log.e(TAG, "initializeLocationManager");
    if (mLocationManager == null) {
        mLocationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
    }
}
}

我使用以下代码启动LocationService。

Intent locationService = new Intent(); 
locationService.setClass(context, LocationService.class);
context.startService(locationService);

使用返回键退出应用程序时,不会调用该服务,也不会收到通知。如何解决这个问题?

我在标签内注册服务,如下所示。

    <application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" 
    android:theme="@style/AppTheme">   
    <activity android:name=".LocationDetails" 
              android:configChanges="orientation|keyboardHidden|screenSize"
              android:label="@string/title_activity_main" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>  


    <service android:name=".LocationService" />        
</application>

3 个答案:

答案 0 :(得分:0)

试试这个..

     Intent locationService = new Intent(); 
     locationService.setClass(context, LocationService.class);
     context.startService(locationService);
     finish();

创建服务后,请完成退出应用。

答案 1 :(得分:0)

您是否在活动的任何地方停止服务?你是否重写了onBackPressed()方法?如果是,请提供代码。

答案 2 :(得分:0)

使用AsyncTask进行后台处理以获取位置