为什么不调用Android的onProviderEnabled()方法?

时间:2011-09-22 00:15:51

标签: android locationmanager

我的Android应用程序有两个位置监听器,一个用于精细监听,一个用于粗略监听。我希望能够检测用户何时关闭和打开其位置服务。

每当我关闭手机GPS或网络位置服务时,都会按预期调用onProviderDisabled方法。当我打开GPS或网络服务时,onProviderEnabled永远不会被调用!

我已将其中一个侦听器的代码放在下面....

更新...

我发现问题与取消注册onPause中的侦听器有关。当我删除代码 “locationManager.removeUpdates(myFineLocationListener);” 时,调用了onProviderEnabled()方法。

也许禁用(比如说)GPS的行为会自动取消注册听众?也许我应该在onDestroy而不是onPause()???

中取消注册监听器

PS。也许我提到我的活动有一个直接进入设备位置设置页面的按钮是相关的。它充当捷径。我使用此快捷方式禁用/启用位置服务,然后使用“后退”按钮返回到我的应用程序。我将把这个按钮的代码放在这篇文章的最后。

代码:

(从onCreate();)

调用createLocListeners()方法
 void createLocListeners() {

        //if null, create a new listener
        //myFineLocationListener is a class variable     
        if (myFineLocationListener == null) {

        //Listen for FINE location updates   
                myFineLocationListener = new LocationListener(){

                    @Override
                    public void onLocationChanged(Location location) {
                        //Do something
                    }

                    @Override
                    public void onProviderDisabled(String provider) {   
                                 //This gets called when I change location settings (eg GPS on or off)  on the phone            }



                                  @Override
                           public void onProviderEnabled(String provider) {
                                  //This DOES NOT get called when I change location settings (eg GPS on or off)  on the phone   
                           }

                    @Override
                    public void onStatusChanged(String provider, int status, Bundle extras) {   
                    }

                };  //end on location listener
        } //end if fine listener is null

    } //end createLocListener() function






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

        //REGISTER LOCATION LISTENERS
        try {
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, LISTENING_INTERVAL, LISTENING_DISTANCE, myFineLocationListener);
        } 
        catch (IllegalArgumentException e){
        //Tried catching exceptions but there weren't any
        }         
        catch (RuntimeException e) {            
        }





    }// end onResume()




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

        //UNREGISTER LOCATION LISTENERS
        locationManager.removeUpdates(myFineLocationListener);

    } //end onPause

类似问题: Location service onProviderEnabled never called

用于打开位置设置页面按钮的代码...

        //JUMP TO LOCATION SERVICES SETTINGS
    ibLoc.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
        }

    }); //end jump to location services button listener

2 个答案:

答案 0 :(得分:13)

IMO,当您进入设置时,将调用onPause()并且未注册侦听器。然后启用GPS并返回到您的活动。因此,当您注册听众时,GPS已经启用,因此永远不会调用侦听器onProviderEnabled(),因为只有在GPS状态更改时才会调用它。

答案 1 :(得分:1)

我在mLocationManager.removeUpdates(this)中遇到了onStop(),当我拉下通知托盘打开位置服务时,它被调用了。因此,虽然我打开了位置,但我的onProviderEnabled()没有被调用。感谢提示@Peter。