Android onStop()、onPause()、onCreate()、onResume()和GPS

Android onStop()、onPause()、onCreate()、onResume()和GPS,android,gps,Android,Gps,我有一个基于GPS的应用程序。它有许多活动,都使用GPS。例如,一个活动显示到某个位置的距离,另一个活动显示速度和方向。我在onCreate()中设置并调用requestLocationUpdates(),在onPause()中调用removeUpdates() 这一切都可以工作,但当切换活动时,GPS会闪烁,并且必须重新获取。我做了一个测试,如果我将removeUpdates()放在onStop()而不是onPause()中,则不会闪烁。显然,新活动开始后会调用onStop(),这解释了为什么

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

这一切都可以工作,但当切换活动时,
GPS
会闪烁,并且必须重新获取。我做了一个测试,如果我将
removeUpdates()
放在
onStop()
而不是
onPause()
中,则不会闪烁。显然,新活动开始后会调用
onStop()
,这解释了为什么没有闪烁

我读过关于这个问题的帖子,似乎有不同的看法。但是,看起来我应该使用
onStop()
,我想知道是否有任何理由我不应该使用

第二个问题是没有
onResume()
code,因此在返回箭头或关闭和打开屏幕后没有
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);
}
这是我的暂停代码:

    @Override
    protected void onPause() {
        super.onPause();
        if(lm != null) {
            lm.removeUpdates(ll);
        }
        ll = null;
        lm = null;
    }
所以我想我应该把onPause()改为onStop(),并将onStart()改为:

我的onCreate代码如下所示

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

这就是说,我对所有这些都有点陌生,这是我的第一个应用程序,所以我想知道我在这里遗漏了什么。

首先,我建议您阅读以下内容

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

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

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

您可以第一次查询网络提供商的位置,因为这应该比GPS快,而且即使不准确,您也可以立即使用它。除此之外,您还可以获得一个位置,以防用户关闭GPS模块

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


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

我做了一些与您的应用程序类似的事情,只是我将GPS功能委托给了一个服务,该服务在没有活动绑定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()中请求更新,然后在onStops()中删除更新。首先,我不是100%了解您在这里问的问题,但我会尽力帮助您<只要活动失去焦点,就会调用code>OnPause
。这主要用于弹出窗口,这样会导致活动处于背景中,但模糊<每次启动新活动时,都会调用code>OnStop。您应该在恢复时将位置检索代码放入
OnResume
<只要应用程序再次启动,就会调用code>OnResume。这包括对
OnCreate
OnStart
的任何调用。你应该把你的
lm.removeUpdates(ll)逻辑也在桌面上。这是在生命周期中普遍接受的位置检索方法;我刚刚用分号结束了一个句子。。。我编写的代码太多了。

为什么不在需要时使用服务并获取位置?我应该说我所有的活动都是GPS活动。我不希望GPS处于关闭状态,即使坐在菜单上,也没有任何活动。我没有访问服务的原因是我不想查询服务,也找不到如何让服务像requestLocationUpdates那样使用onChange()响应。我的意思是,位置经理基本上不是一项服务吗?我很感激你列出的活动流程。我从中看到,onStart#2先于onStop#1,这是保持GPS灯亮起的原因。如果我知道如何让服务像LocationManager那样将更新推送到我的代码中,我会使用服务。学习Ibinder接口,了解如何从活动向服务传递参数。让服务do sendBroadcast()并让活动中的广播接收器接收广播。额外的内容可以传递到广播中,这些内容可以将数据从服务发送到活动中。我将所有代码都更改为使用onStart和onStop,到目前为止效果良好。我确实想最终做GPS记录(每秒保存位置和速度),因此需要一项服务。很高兴听到服务可以广播,活动可以接收广播,因为这是我需要的基本部分,值得学习。欢迎链接到好的教程。谢谢你的帮助。
FIRST Activity onCreate
FIRST Activity onStart
FIRST Activity onResume
FIRST Activity onPause
SECOND Activity onCreate
SECOND Activity onStart
SECOND Activity onResume
FIRST Activity onStop