onStop(), onPause(), onCreate(), onResume(), and GPS



我有一个基于GPS的应用程序。它有许多活动,并且都使用GPS。例如,一个活动显示到某个位置的距离,另一个活动则显示速度和方向。我在onCreate()中设置并调用requestLocationUpdates(),在onPause()中调用removeUpdates()

这一切都有效,但GPS会闪烁,并且在切换活动时必须重新获取。我做了一个测试,如果我把removeUpdates()放在onStop()而不是onPause()中,就不会闪烁。显然,onStop()是在新活动开始后调用的,这解释了没有闪烁的原因。

我读过关于这个主题的帖子,似乎有不同的意见。然而,看起来我应该使用onStop(),我想知道是否有什么理由不应该。

第二个问题是没有onResume()代码,所以在返回箭头后或关闭和打开屏幕后没有GPS。我应该解决这个问题。现在,我的onCreate()代码创建了位置管理器,并且基本上包含了我的所有代码。看起来就像按照生命周期流程图,我应该将removeUpdates()移动到onStop,并将lm和ll的创建移动到onStart()。这是正确的吗?

这是我的onCreate()代码:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.set);
    textView1 = (TextView)findViewById(R.id.textView1);
    lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    ll = new mylocationlistener();
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, ll);
}

这是我的onPause代码:

    @Override
    protected void onPause() {
        super.onPause();
        if(lm != null) {
            lm.removeUpdates(ll);
        }
        ll = null;
        lm = null;
    }

所以我想我应该把onPause()改为onStop(),然后把onStart()改成这个:

@Override
public void onStart() {
    super.onStart();
    lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    ll = new mylocationlistener();
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, ll);
}

我的onCreate代码是这样的;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.set);
    textView1 = (TextView)findViewById(R.id.textView1);
  }

也就是说,我对这一切有点陌生,这是我的第一份申请,所以我想知道我在这里缺少了什么。

我做了一些类似于您的应用程序的事情,只是我将GPS功能委托给了一个服务,该服务在没有活动绑定到GPS时停止GPS,在活动绑定到它时启动GPS。我在onStarts中绑定到服务,在onStops中取消绑定。当我切换活动时,登录..方法会给出这样的序列:

FIRST Activity onCreate
FIRST Activity onStart
FIRST Activity onResume
FIRST Activity onPause
SECOND Activity onCreate
SECOND Activity onStart
SECOND Activity onResume
FIRST Activity onStop

如果是通过服务完成的,所以我只有一个LocationManager可以控制,你可以采取同样的方法,或者在onStarts()中请求Updates,并在onStops()中删除它们

首先,我建议阅读以下关于定位策略的好文章。

如果你只想一次性定位,你需要使其与活动生命周期更加独立,因为获取GPS位置可能需要比用户切换活动更长的时间。

因此,不要在onPause或onStop中停止请求。您可以使用一个特殊的位置查询处理程序,它作为应用程序对象中的单例实例(为此创建应用程序的派生)。

如果有必要,请告诉位置处理程序在活动的onStart或onResume方法中获得新的修复。让处理程序保留最新和最佳的位置数据,这些数据可以根据需要立即使用。

你可以第一次查询NETWORK_PROVIDER的位置,因为这应该比GPS更快,即使它不准确,你也可以立即找到工作。除此之外,你还可以得到一个位置,以防用户关闭GPS模块。

然而,这取决于结果的准确性。你也可以创建一个本地服务,查询GPS位置并等待结果。结果出来后,您可以通过本地广播意向通知您当前正在运行的活动。

在任何情况下,您都可以使用locationManager.getLastKnownLocation 获取最后一个已知位置

首先,我不是100%你在问什么问题,但我会尽力帮助你。每当"活动"失去焦点时,就会调用OnPause。这主要是针对弹出窗口,这些弹出窗口会导致"活动"处于背景中,但会变得模糊。每当启动一个新活动时,就会调用OnStop。您应该将您的位置检索代码放在OnResume中。CCD_ 22在应用程序再次开始时被调用。这包括对OnCreateOnStart的任何调用。您也应该将lm.removeUpdates(ll);逻辑放在OnStop中。这是一种在生命周期中普遍接受的位置检索方法;我刚刚用分号结束了一个句子。。。我编码太多了。

最新更新