2015-06-22 48 views
-3

如何将此活动修改为某个服务,我希望能够从另一个活动调用此服务,并且为了能够在后台工作,即使用户不是实际上在应用程序中。当我尝试将其转换为服务时,我遇到了onResume(),onStart(),onStop()和finish()的问题。我该如何解决这个问题? 这是代码作为活动:将活动中的代码变为服务困难

public class MainActivity extends Activity implements ConnectionCallbacks, 
    OnConnectionFailedListener, LocationListener { 

// LogCat tag 
private static final String TAG = MainActivity.class.getSimpleName(); 

private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 1000; 

private Location mLastLocation; 

// Google client to interact with Google API 
private GoogleApiClient mGoogleApiClient; 

// boolean flag to toggle periodic location updates 
private boolean mRequestingLocationUpdates = false; 

private LocationRequest mLocationRequest; 

// Location updates intervals in sec 
private static int UPDATE_INTERVAL = 10000; // 10 sec 
private static int FATEST_INTERVAL = 5000; // 5 sec 
private static int DISPLACEMENT = 10; // 10 meters 

// UI elements 
private TextView lblLocation; 
private Button btnShowLocation, btnStartLocationUpdates; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    lblLocation = (TextView) findViewById(R.id.lblLocation); 
    btnShowLocation = (Button) findViewById(R.id.btnShowLocation); 
    btnStartLocationUpdates = (Button) findViewById(R.id.btnLocationUpdates); 

    // First we need to check availability of play services 
    if (checkPlayServices()) { 

     // Building the GoogleApi client 
     buildGoogleApiClient(); 

     createLocationRequest(); 
    } 

    // Show location button click listener 
    btnShowLocation.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      displayLocation(); 
     } 
    }); 

    // Toggling the periodic location updates 
    btnStartLocationUpdates.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      togglePeriodicLocationUpdates(); 
     } 
    }); 

} 

@Override 
protected void onStart() { 
    super.onStart(); 
    if (mGoogleApiClient != null) { 
     mGoogleApiClient.connect(); 
    } 
} 

@Override 
protected void onResume() { 
    super.onResume(); 

    checkPlayServices(); 

    // Resuming the periodic location updates 
    if (mGoogleApiClient.isConnected() && mRequestingLocationUpdates) { 
     startLocationUpdates(); 
    } 
} 

@Override 
protected void onStop() { 
    super.onStop(); 
    if (mGoogleApiClient.isConnected()) { 
     mGoogleApiClient.disconnect(); 
    } 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    stopLocationUpdates(); 
} 

/** 
* Method to display the location on UI 
* */ 
private void displayLocation() { 

    mLastLocation = LocationServices.FusedLocationApi 
      .getLastLocation(mGoogleApiClient); 

    if (mLastLocation != null) { 
     double latitude = mLastLocation.getLatitude(); 
     double longitude = mLastLocation.getLongitude(); 

     lblLocation.setText(latitude + ", " + longitude); 

    } else { 

     lblLocation 
       .setText("(Couldn't get the location. Make sure location is enabled on the device)"); 
    } 
} 

/** 
* Method to toggle periodic location updates 
* */ 
private void togglePeriodicLocationUpdates() { 
    if (!mRequestingLocationUpdates) { 
     // Changing the button text 
     btnStartLocationUpdates 
       .setText(getString(R.string.btn_stop_location_updates)); 

     mRequestingLocationUpdates = true; 

     // Starting the location updates 
     startLocationUpdates(); 

     Log.d(TAG, "Periodic location updates started!"); 

    } else { 
     // Changing the button text 
     btnStartLocationUpdates 
       .setText(getString(R.string.btn_start_location_updates)); 

     mRequestingLocationUpdates = false; 

     // Stopping the location updates 
     stopLocationUpdates(); 

     Log.d(TAG, "Periodic location updates stopped!"); 
    } 
} 

/** 
* Creating google api client object 
* */ 
protected synchronized void buildGoogleApiClient() { 
    mGoogleApiClient = new GoogleApiClient.Builder(this) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API).build(); 
} 

/** 
* Creating location request object 
* */ 
protected void createLocationRequest() { 
    mLocationRequest = new LocationRequest(); 
    mLocationRequest.setInterval(UPDATE_INTERVAL); 
    mLocationRequest.setFastestInterval(FATEST_INTERVAL); 
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    mLocationRequest.setSmallestDisplacement(DISPLACEMENT); 
} 

/** 
* Method to verify google play services on the device 
* */ 
private boolean checkPlayServices() { 
    int resultCode = GooglePlayServicesUtil 
      .isGooglePlayServicesAvailable(this); 
    if (resultCode != ConnectionResult.SUCCESS) { 
     if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) { 
      GooglePlayServicesUtil.getErrorDialog(resultCode, this, 
        PLAY_SERVICES_RESOLUTION_REQUEST).show(); 
     } else { 
      Toast.makeText(getApplicationContext(), 
        "This device is not supported.", Toast.LENGTH_LONG) 
        .show(); 
      finish(); 
     } 
     return false; 
    } 
    return true; 
} 

/** 
* Starting the location updates 
* */ 
protected void startLocationUpdates() { 

    LocationServices.FusedLocationApi.requestLocationUpdates(
      mGoogleApiClient, mLocationRequest, this); 

} 

/** 
* Stopping location updates 
*/ 
protected void stopLocationUpdates() { 
    LocationServices.FusedLocationApi.removeLocationUpdates(
      mGoogleApiClient, this); 
} 

/** 
* Google api callback methods 
*/ 
@Override 
public void onConnectionFailed(ConnectionResult result) { 
    Log.i(TAG, "Connection failed: ConnectionResult.getErrorCode() = " 
      + result.getErrorCode()); 
} 

@Override 
public void onConnected(Bundle arg0) { 

    // Once connected with google api, get the location 
    displayLocation(); 

    if (mRequestingLocationUpdates) { 
     startLocationUpdates(); 
    } 
} 

@Override 
public void onConnectionSuspended(int arg0) { 
    mGoogleApiClient.connect(); 
} 

@Override 
public void onLocationChanged(Location location) { 
    // Assign the new location 
    mLastLocation = location; 

    Toast.makeText(getApplicationContext(), "Location changed!", 
      Toast.LENGTH_SHORT).show(); 

    // Displaying the new location on UI 
    displayLocation(); 
} 

回答