我遇到了取消闹钟和启动服务的问题。
我在一项活动中设置闹钟:
public class AlarmStarter extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent locationPollerIntent = new Intent(this, LocationPoller.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast
(getApplicationContext(), REQUEST_CODE, locationPollerIntent, 0);
alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime(), 6000, pendingIntent);
}
}
LocationPoller意图将启动服务以获取设备的位置。 所以我使用alarmManager以特定频率重复此搜索。
之后,当我在BroadcastReceiver上获取我的位置时,我会调用另一个Activity来显示该位置并触发通知。
此时,我想停止搜索该位置。 所以我尝试取消alarmManager。
public class Notifier extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.alarm_notifier);
findViewById(R.id.btTurnOffAlarm).
setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent intentToStop = new Intent(this, LocationPoller.class);
PendingIntent pendingIntentToStop = PendingIntent.getBroadcast
(getApplicationContext(), REQUEST_CODE, intentToStop, 0);
AlarmManager alarmManager = (AlarmManager)
getSystemService(ALARM_SERVICE);
alarmManager.cancel(pendingIntentToStop);
}
});
}
}
但这不起作用,它继续搜索位置。
任何线索?
感谢。
答案 0 :(得分:3)
你必须使意图独特。
类似于:
locationPollerIntent.setData((Uri.parse("YOUR UNIQUE ID FOR THIS INTENT")));
当您为您取回正确的警报时,AlarmManager将检查意图的数据字段。 只需为意图数据设置一个唯一的Uri。
所以当你收到警报时,请执行以下操作:
intentToStop.setData((Uri.parse("YOUR SAME UNIQUE ID FOR THIS INTENT")));
警报应该在取消之后取消。
答案 1 :(得分:1)
REQUEST_CODE
在两个地方都需要相同;您没有显示代码清单中定义的位置。
此外,您在此处不需要getApplicationContext()
- this
也能正常使用。
答案 2 :(得分:0)
您必须传递相同的实例。
public static final Uri MYURI = Uri.parse("Some_Uri");
[...]
locationPollerIntent.setData(MyClass.MYURI);
[...]
intentToStop.setData(MyClass.MYURI);
如果每次创建Intent时有两个不同的引用,它将无效。
此处有更详细的例子:
http://malubu.wordpress.com/2012/06/05/take-your-time-widgets-and-alarmmanager/
答案 3 :(得分:0)
我有同样的问题,它不是关于具有相同的Intent“locationPollerIntent”和“intentToStop”实例,但是你必须为PendingIntent提供相同的实例。
停止AlarmManager后,服务也会停止。
static PendingIntent instance;
public static PendingIntent getInstance(Context context) {
if (instance == null)
{
Intent intent = new Intent(context, LocationPoller.class);
instance = PendingIntent.getService(context, REQUEST_CODE, intent, 0);
}
return instance;
}