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

时间:2012-07-27 17:18:44

标签: android gps

我有一个基于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);
  }

这就是说,我对这一切都不熟悉,这是我的第一个申请,所以我想知道我在这里缺少什么。

3 个答案:

答案 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。这包括对OnCreateOnStart的任何来电。您也应该将lm.removeUpdates(ll);逻辑放在OnStop中。这是生命周期中位置检索的普遍接受方法;我刚刚用分号结束了一个句子...我编码太多了。