我有一个基于GPS
的应用程序。它有许多活动,都使用GPS
。例如,一个活动显示到某个位置的距离,另一个显示速度和方向。我在requestLocationUpdates()
设置并致电onCreate()
,并在removeUpdates()
中致电onPause()
。
这一切都有效但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);
}
这就是说,我对这一切都不熟悉,这是我的第一个申请,所以我想知道我在这里缺少什么。
答案 0 :(得分:7)
我已经做了类似于你的应用程序的事情,除了我已经将GPS功能委托给一项服务,该服务在没有任何活动绑定时停止GPS并在活动绑定到它时启动它。我绑定到onStarts中的服务并在onStops中取消绑定。切换活动时记录on ..方法会得到如下序列:
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()中的requestUpdates,并在onStops中移除它们()
答案 1 :(得分:1)
首先,我建议您仔细阅读location strategies。
如果您只想进行一次性的位置修复,则需要使其与活动生命周期更加独立,因为获取GPS位置所需的时间可能比用户切换活动的时间长。
所以不要在onPause或onStop上停止请求。您可以使用一个特殊的位置查询处理程序,它在Application对象中作为单例实例存在(为此创建Application的衍生物)。
告诉位置处理程序,如果有必要,可以在您的活动'onStart或onResume方法中获取新的修复程序。让处理程序保留最新和最佳位置数据,可以根据需要立即使用。
您可以第一次查询NETWORK_PROVIDER位置,因为这应该比GPS更快,即使它不准确,您也可以立即使用。最重要的是,如果用户关闭GPS模块,您还可以获得一个位置。
但是,这取决于结果的准确程度。您还可以创建一个本地服务,查询GPS位置并等待其结果。当结果出现时,您可以通过本地广播意图通知当前正在运行的活动。
在任何情况下,您都可以使用locationManager.getLastKnownLocation获取最后一个已知位置
答案 2 :(得分:0)
首先,我不是100%你在这里问的问题,但我会尽力帮助你。只要Activity失去焦点,就会调用OnPause
。这主要用于弹出窗口,这会导致Activity在后台,但模糊不清。每当启动新活动时都会调用OnStop
。您应将位置检索代码放在OnResume
中。只要应用程序再次开始,就会调用OnResume
。这包括对OnCreate
或OnStart
的任何来电。您也应该将lm.removeUpdates(ll);
逻辑放在OnStop中。这是生命周期中位置检索的普遍接受方法;我刚刚用分号结束了一个句子...我编码太多了。