简体   繁体   中英

Android onResume method called when activity is not visible

I want to the access the gps service in my application.So I used Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); inside the onClick() method of a button.After calling the Intent I start the service to listen for location updates.In the onResume method I check for gps service.If it is disabled,I stop the service.But the onResume method is called when the Location Settings is shown and the service is ultimately stopped even before the user can turn on the gps.

Code:

     Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
     i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
     startActivity(i);
     gps_intent=new Intent(AddOffers.this, StatsGpsService.class);
     gps_intent.putExtra("offr_act_ind",true);
     startService(gps_intent);



 @Override
     protected void onResume() {
     super.onResume();
     LocationManager locationManager=(LocationManager) getSystemService(Context.LOCATION_SERVICE);
     boolean isproviderenabled=locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    if(isproviderenabled==false){
        if(gps_intent!=null){
            Log.e("g","g");
        stopService(gps_intent);
    }}

StatsGpsService.java:

public class StatsGpsService extends Service {
    LocationListener locationListener;
    LocationManager locationManager;
    boolean flag1;

    public StatsGpsService() {
        super();

    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.e("Service","Created");


    }

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

        handleLocation(intent);
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.e("Service","Destroyed");
    }

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

    public void handleLocation(Intent intent){
        if(intent!= null) {
            flag1 = intent.getBooleanExtra("offr_act_ind", false);

            locationListener = new LocationListener() {
                @Override
                public void onLocationChanged(Location location) {
                    if (flag1 == true) {

                        Intent intent = new Intent("loc_updts");
                        intent.putExtra("stat_lat", location.getLatitude());
                        intent.putExtra("stat_longt", location.getLongitude());
                        sendBroadcast(intent);
                    }
                }

                @Override
                public void onStatusChanged(String s, int i, Bundle bundle) {

                }

                @Override
                public void onProviderEnabled(String s) {

                }

                @Override
                public void onProviderDisabled(String s) {
                    Log.e("Provider","Disabled");

                }
            };
            locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);


            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.
                return;
            }

            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 10, locationListener);
        }
    }
}

Do not check GPS status on onResume. Use startActivityForResult to open Settings.

And check Gps Status on onActivityResult

To open setting use below code

Intent SettingIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
SettingIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult(SettingIntent,Utils.SETTING_INTENT_REQUESTCODE// any int code you can use);

To handle result you need to override onActivityResult method of Activity

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == Utils.SETTING_INTENT_REQUESTCODE// this should be same int that you passed to start acitivity) {
            LocationManager locationManager=(LocationManager) getSystemService(Context.LOCATION_SERVICE);
            boolean isproviderenabled=locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
            if(isproviderenabled==false){
                if(gps_intent!=null){
                    Log.e("g","g");
                    stopService(gps_intent);
                }
            }
        }
    }

Hope it will work for you

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM