Я использую сервис Firebase JobScheduler, чтобы продолжить обновление местоположения, когда кнопка «ON» постоянно обновляет местоположение, даже если приложение убито из фона.но когда я снова открываю приложение.снова и попытайтесь остановить обновление местоположения. Моя служба заданий никогда не останавливается.
FBJDSingleton.java (FirebaseJobDispatcher single tone class)
public class FBJDSingleton {
private static FirebaseJobDispatcher firebaseJobDispatcher;
private FBJDSingleton() {
}
public static FirebaseJobDispatcher getInstance(Context context) {
if (firebaseJobDispatcher == null) {
firebaseJobDispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(context));
} return firebaseJobDispatcher;
}
}
MainActivity.java
final FirebaseJobDispatcher dispatcher = FBJDSingleton.getInstance(this);
btnON.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Job job=dispatcher.newJobBuilder()
.setService(MyJobService.class)
.setLifetime(Lifetime.FOREVER)
.setRecurring(true)
.setTag("my_job")
.setTrigger(Trigger.executionWindow(5,5))
.setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL)
.setConstraints(Constraint.ON_ANY_NETWORK)
.setReplaceCurrent(false).build();
dispatcher.mustSchedule(job);
}
});
btnOFF.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dispatcher.cancelAll();
}
});
MyJobService.java
public class MyJobService extends JobService implements GoogleApiClient.ConnectionCallbacks,GoogleApiClient.OnConnectionFailedListener,LocationListener {
GoogleApiClient mLocationClient;
LocationRequest mLocationRequest = new LocationRequest();
@Override
public void onCreate() {
super.onCreate();
mLocationClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
mLocationRequest.setInterval(1000);
// mLocationRequest.setSmallestDisplacement(10);
mLocationRequest.setFastestInterval(1000);
int priority = LocationRequest.PRIORITY_HIGH_ACCURACY; //by default
mLocationRequest.setPriority(priority);
mLocationClient.connect();
}
@Override
public boolean onStartJob(JobParameters job) {
connectGoogleClient(job);
return false;
}
@Override
public boolean onStopJob(JobParameters job) {
jobFinished(job, false);
return true;
}
private void connectGoogleClient(JobParameters parameters){
jobFinished(parameters, true);
}
@Override
public void onConnected(@Nullable Bundle bundle) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
//Permission not granted by user so cancel the further execution.
return;
}
LocationServices.FusedLocationApi.requestLocationUpdates(mLocationClient, mLocationRequest,this);
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
}
@Override
public void onLocationChanged(Location location) {
if (location != null) {
//Send result to activities
if(Build.VERSION.SDK_INT>=18){
Log.e("test","1");
if(location.isFromMockProvider()){
Log.e("test","2");
Toast.makeText(this,"Turn off fake location.",Toast.LENGTH_SHORT).show();
}else {
Log.e("test","3");
sendMessageToUI(String.valueOf(location.getLatitude()), String.valueOf(location.getLongitude()));
}
}
if(Build.VERSION.SDK_INT<18){
if(Settings.Secure.getString(getContentResolver(), Settings.Secure.ALLOW_MOCK_LOCATION).equals("0")) {
Log.e("test","4");
Toast.makeText(this,"Turn off fake location.",Toast.LENGTH_SHORT).show();
}else {
Log.e("test","5");
sendMessageToUI(String.valueOf(location.getLatitude()), String.valueOf(location.getLongitude()));
}
}
}
}
private void sendMessageToUI(String lat, String lng) {
Log.e("test","latitude:"+lat);
Log.e("test","longitude:"+lng);
}
}