我将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或更新周期)时停止所有内容。然后使用新值重新创建所有内容。
谢谢,
伟大的代码BTW - 正是我想跟踪我的越野之旅:)
答案 0 :(得分: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:“伟大的代码”!
答案 1 :(得分:0)
您目前的设计是否可行?
不,抱歉。这在理论上可以添加,但可能有点棘手,而且目前肯定不存在。
基本上我正在尝试做的是当用户(我旅行中)更改首选项(例如超时,或使用GPS或更新周期)时停止所有内容。然后使用新值重新创建所有内容。
这是一个非常合理的概念,而不是LocationPoller
支持的概念。 LocationPoller
的设计更多是针对“每小时检查”的各种情况,在用户碰巧正在操作应用的UI时,统计上不太可能进行检查。