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