【问题标题】:GPS icon won't disappear when activity destroyed?活动被破坏时GPS图标不会消失?
【发布时间】:2010-09-19 04:25:13
【问题描述】:

作为一名尝试使用 GPS 的 Android 新手,我设法将这段代码放在一起,它的工作方式与我期望的一样,除了一件事之外,GPS 图标永远不会消失。 Activity被销毁时如何让GPS图标消失?我有

locationManager.removeUpdates(GPSMapTest.this);     
locationManager = null;

在我的onPause() 中,但显然这还不够?谢谢。

这个问题存在于模拟器和我的 HTC EVO 2.2 中。在我的 EVO 上,当 Activity 被销毁时,图标会保留在那里,只有在我卸载应用程序时才会消失。

    public class GPSMapTest extends MapActivity implements LocationListener, OnClickListener {
    /** Called when the activity is first created. */

    private MapView mapView;
    private MapController mapController;        
    private LocationManager locationManager;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setFormat(PixelFormat.TRANSPARENT);
        setContentView(R.layout.main);

        mapView = (MapView)findViewById(R.id.mapview);
        mapController = mapView.getController();              

        mapController.setZoom(18); 
        mapView.setClickable(true);
        mapView.setEnabled(true);
        mapView.setSatellite(true);

        Button buttonCurrentLoc = (Button)findViewById(R.id.myloc_btn);
        buttonCurrentLoc.setOnClickListener(this);     

    }//End onCreate()        

    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }   

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

        locationManager.removeUpdates(GPSMapTest.this);     
        locationManager = null;

    }

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

        locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

        Criteria criteria = new Criteria();
        criteria.setAccuracy(Criteria.ACCURACY_FINE);
        criteria.setPowerRequirement(Criteria.POWER_LOW);       
        criteria.setAltitudeRequired(false);
        criteria.setBearingRequired(false);
        criteria.setSpeedRequired(false);
        criteria.setCostAllowed(false);     

        final String bestProvider = locationManager.getBestProvider(criteria, true);

        Toast.makeText(GPSMapTest.this, "Best Provider: " + bestProvider, Toast.LENGTH_SHORT).show();

        locationManager.requestLocationUpdates(bestProvider, 60000, 1, GPSMapTest.this);

        Location location = locationManager.getLastKnownLocation(bestProvider);     

        if (location != null) {

            Double latitude = location.getLatitude()*1E6;
            Double longitude = location.getLongitude()*1E6;
            GeoPoint point = new GeoPoint(latitude.intValue(),longitude.intValue());

            final MyLocationOverlay myLocationOverlay = new MyLocationOverlay(GPSMapTest.this, mapView);        
            mapView.getOverlays().add(myLocationOverlay);           
            myLocationOverlay.enableMyLocation();

            mapController.animateTo(point); 

        }

        mapView.setBuiltInZoomControls(true);           

    }

    public void onClick(View v) {

        switch (v.getId()) {

        case (R.id.myloc_btn):

            locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

            Criteria criteria = new Criteria();
            criteria.setAccuracy(Criteria.ACCURACY_FINE);
            criteria.setPowerRequirement(Criteria.POWER_LOW);       
            criteria.setAltitudeRequired(false);
            criteria.setBearingRequired(false);
            criteria.setSpeedRequired(false);
            criteria.setCostAllowed(false);     

            final String bestProvider = locationManager.getBestProvider(criteria, true);
            Location location = locationManager.getLastKnownLocation(bestProvider);     

            if (location != null) {

                Double latitude = location.getLatitude()*1E6;
                Double longitude = location.getLongitude()*1E6;
                GeoPoint point = new GeoPoint(latitude.intValue(),longitude.intValue());

                final MyLocationOverlay myLocationOverlay = new MyLocationOverlay(GPSMapTest.this, mapView);        
                mapView.getOverlays().add(myLocationOverlay);           
                myLocationOverlay.enableMyLocation();

                mapController.animateTo(point); 
            }

            mapView.setBuiltInZoomControls(true);                   

        break;              

        }

    }       

    public void onLocationChanged(Location location) {

        locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);     

        if (location != null) {

            final MyLocationOverlay myLocationOverlay = new MyLocationOverlay(GPSMapTest.this, mapView);        
            mapView.getOverlays().add(myLocationOverlay);           
            myLocationOverlay.enableMyLocation();

            myLocationOverlay.runOnFirstFix(new Runnable() {

                public void run() {                 
                    mapController.animateTo(myLocationOverlay.getMyLocation());                                  
                    }

            });                 
        }

        mapView.setBuiltInZoomControls(true);                   

    }

    public void onProviderDisabled(String provider) {       


    }

    public void onProviderEnabled(String provider) {


    }

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


    }

}

没有人吗?我用我有限的知识尝试了一切!救命!

【问题讨论】:

  • 查看修改后的答案,您首先调用 super.onPause(),最后调用它。

标签: android icons gps


【解决方案1】:

我相信这是因为您使用的是MyLocationOverlay 并且拥有enableMyLocation()

MyLocationOverlay myLocOverlay = new MyLocationOverlay(this, mapView);
    myLocOverlay.enableMyLocation();
    mapOverlays.add(myLocOverlay);

如果您删除该行代码,一切都会正常工作。在您要调用的 OnPause() 中:

myLocOverlay.disableMyLocation();

并在onResume() 致电:

myLocOverlay.enableMyLocation();

【讨论】:

  • 我注意到我不小心在 onCreate 方法之外调用的方法中为 myLocationOverlay 添加了一个新的构造函数。这导致新的 LocationOverlay 被实例化而不会破坏旧的,并保持 GPS 在后台“运行”。
【解决方案2】:

如果您将MyLocOverlay 对象作为类变量“myLocOverlay”存储在您的活动中,则以下工作。 优先使用 onStop() 而不是 onPause() 以避免不必要地停止和重新启动本地化。 onStop() 在“活动不再对用户可见”时被调用。

  @Override
    protected void onStop() {
    super.onStop();
    myLocOverlay.disableMyLocation();
    mapOverlays.remove(myLocOverlay);
    }

我没有足够的声誉来发表评论,但是:“magaios”的答案是错误,如official example 所示。 应该先调用super.onPause()

【讨论】:

    【解决方案3】:

    您在删除更新之前致电super.onPause()!您的Activity 永远不会解决它。切换它:

    locationManager.removeUpdates(this);
    super.onPause();
    

    【讨论】:

    • 谢谢,但我试过了……同样的问题,GPS 图标仍然亮着。
    猜你喜欢
    • 2023-03-19
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多