【问题标题】:GPS icon disappear when open location popup or the app is killed打开位置弹出窗口或应用程序被杀死时 GPS 图标消失
【发布时间】:2017-05-21 13:06:27
【问题描述】:

我正在开发一个应用程序,它应该每 10 分钟向服务器发送一次 gps 数据。问题是当我在 GPS 开启时终止应用程序时,GPS 图标从状态栏中消失(而 GPS 仍然开启)并且不再发送数据。如果我对谷歌地图应用程序执行相同操作,则图标不会消失。 有人可以解释一下为什么会这样吗? 这是我使用的代码

报警管理器

/**
 * ALARM_MANAGER_GPS_TIME_INTERVAL = 10 min
 */
PendingIntent mPendingIntent = PendingIntent
            .getService(
                    context,
                    PENDING_INTENT_REQUEST_CODE_FOR_GPS,
                    new Intent(context, GpsDataService.class),
                    PendingIntent.FLAG_IMMUTABLE);
    AlarmManager mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    mAlarmManager.setInexactRepeating(
            AlarmManager.ELAPSED_REALTIME_WAKEUP,
            SystemClock.elapsedRealtime(),
            ALARM_MANAGER_GPS_TIME_INTERVAL,
            mPendingIntent);

服务

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

/**
 * Provides the entry point to Google Play services.
 */
protected GoogleApiClient mGoogleApiClient;

/**
 * Stores parameters for requests to the FusedLocationProviderApi.
 */
protected LocationRequest mLocationRequest;

/**
 * Represents a geographical location.
 */
protected Location mCurrentLocation;

private String mPayLoad;
private GpsPojoBuilder mGpsPojoBuilder;

@Override
public void onCreate() {
    super.onCreate();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {


    if(mGoogleApiClient == null)
        buildGoogleApiClient();

    mGoogleApiClient.connect();

    if (mGoogleApiClient.isConnected())
        startLocationUpdates();

    return Service.START_NOT_STICKY;
}
protected synchronized void buildGoogleApiClient() {

    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(LocationServices.API)
            .build();

    createLocationRequest();
}
/**
 * UPDATE_INTERVAL_IN_MILLISECONDS = 4 sec
 * FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS = 2 sec
 */
protected void createLocationRequest() {
    mLocationRequest = new LocationRequest();
    mLocationRequest
            .setInterval(UPDATE_INTERVAL_IN_MILLISECONDS)
            .setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS)
            .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
}

@Override
public void onConnected(@Nullable Bundle bundle) {
    startLocationUpdates();
}
@Override
public void onConnectionSuspended(int i) {
    // The connection to Google Play services was lost for some reason. Call connect() to
    // attempt to re-establish the connection.
    mGoogleApiClient.connect();
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
/**
 * Requests location updates from the FusedLocationApi.
 */
protected void startLocationUpdates() {
    checkForPermission();
}
private void checkForPermission() {

    Location location;

    if (Build.VERSION.SDK_INT >= 23) {

        if (ContextCompat.checkSelfPermission(getApplicationContext(),
                Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            //permission denied
        } else {
            location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
            if (location != null)
                handleLocation(location);
            else
                LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
        }
    }else {
        location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
        if(location != null)
            handleLocation(location);
        else
            LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
    }
}
@Override
public void onLocationChanged(Location location) {
    handleLocation(location);
}
private void handleLocation(Location location){

    mCurrentLocation = location;

    Toast.makeText(this, "location foound: " + location.toString(), Toast.LENGTH_SHORT).show();

    Thread thread = new Thread() {
        @Override
        public void run() {
            try {
                mGpsPojoBuilder = new GpsPojoBuilder(getApplicationContext());
                mPayLoad = mGpsPojoBuilder
                        .getCheckInJson(mCurrentLocation.getLatitude(), mCurrentLocation.getLongitude());
                sendJSON(mPayLoad, CHECKINS_URL);
            } catch (GooglePlayServicesRepairableException e) {
                e.printStackTrace();
            } catch (GooglePlayServicesNotAvailableException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if(mGoogleApiClient.isConnected()) {
                    stopLocationUpdates();
                    mGoogleApiClient.disconnect();
                }
            }
        }
    };
    thread.start();
}
public void sendJSON(String payLoadData, String url_suffix) {
    HttpConnectionCreator mHttpConncectionClass = new HttpConnectionCreator(payLoadData, url_suffix);
    mHttpConncectionClass.connect();
}
/**
 * Removes location updates from the FusedLocationApi.
 */
protected void stopLocationUpdates() {
               LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
}

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

@Override
public void onDestroy() {

    if (mGoogleApiClient.isConnected()) {
        stopLocationUpdates();
        mGoogleApiClient.disconnect();
    }
    super.onDestroy();
  }
}

【问题讨论】:

    标签: android android-gps


    【解决方案1】:

    根据android.developer,如果你想让你的服务保持活跃,你需要使用START_STICKY。

    int START_STICKY 从 onStartCommand(Intent, int, int) 返回的常量:如果该服务的进程在启动时被杀死(从 onStartCommand(Intent, int, int) 返回后),则将其保持在已启动状态但不保留此状态传递的意图。稍后系统会尝试重新创建服务。

    在以下函数中:

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    
    
    if(mGoogleApiClient == null)
        buildGoogleApiClient();
    
    mGoogleApiClient.connect();
    
    if (mGoogleApiClient.isConnected())
        startLocationUpdates();
    
    return Service.START_NOT_STICKY;
    

    }

    改成这样:

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    
    
    if(mGoogleApiClient == null)
        buildGoogleApiClient();
    
    mGoogleApiClient.connect();
    
    if (mGoogleApiClient.isConnected())
        startLocationUpdates();
    
    return Service.START_STICKY;
    

    }

    【讨论】:

    • 感谢您的回答。但实际上我的目标不是让服务保持活力。我只想每十分钟创建一次服务,将数据发送到服务器,然后停止服务。为什么我需要保持服务活着?我是不是误会了什么?
    猜你喜欢
    • 2013-10-05
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2017-05-24
    相关资源
    最近更新 更多