0

我将 OMGStop() 方法修改为更像这样的方法:

public void cancelUpdates() {
    //TODO potential bug here
    if(pi == null)
        setPendingIntent();
    mgr.cancel(pi);     

    //Should one of these work?
    stopService(new Intent(applicationContext, LocationPoller.class));
    stopService(new Intent(applicationContext, LocationPollerService.class));

我将 pi (PendingIntent) 存储为我的活动类中的成员。这可以很好地从 AlarmManager 中删除 PendingIntent。

然而...

如果正在进行一项,我希望能够停止当前的位置调查。您当前的设计是否可行?我以为我可以停止服务,但 GPS 继续运行。

基本上,我要做的是在用户(我在旅途中)更改偏好(例如超时、使用 GPS 或更新周期)时停止一切。然后使用新值重新创建所有内容。

谢谢,

很棒的代码顺便说一句 - 正是我想要跟踪我的越野旅程:)

4

2 回答 2

2

我遇到了同样的问题。- 有时我让鼠标指针悬停在“mgr.setRepeating(..)”上并阅读 Eclipse 的一些 (Indigo) 提示:“如果已经为同一个 IntentSender 安排了警报,它将首先被取消。” 但是到那时 IntentSender 可能会消失。这使我想到了以下“解决方案”(在原始 CommonsWare 代码中):

if(pi == null) {
  Intent i = new Intent(this, LocationPoller.class);
  pi = PendingIntent.getBroadcast(this, 0, i, 0);
  mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
    SystemClock.elapsedRealtime() + 1000, PERIOD, pi);
}
mgr.cancel();

通过添加 1000 毫秒,我试图确保 AlarmManager 在被 cancel() 击中之前没有机会启动。

HTH,问候。

PS:我想引用 mparkes:“伟大的代码”!

于 2012-11-04T19:00:04.967 回答
0

您当前的设计是否可行?

不,对不起。这在理论上是可以添加的,但可能有点棘手,而且目前绝对不存在。

基本上,我要做的是在用户(我在旅途中)更改偏好(例如超时、使用 GPS 或更新周期)时停止一切。然后使用新值重新创建所有内容。

这是一个完全合理的概念,只是不LocationPoller支持。LocationPoller更多地是为“每小时检查一次”的场景而设计的,在这种场景中,当用户碰巧在操作您的应用程序的 UI 时,从统计上来说不太可能进行检查。

于 2012-08-21T19:52:49.770 回答