无法停止使用alarmManager启动的服务

时间:2011-09-30 03:34:58

标签: android service location alarmmanager

我遇到了取消闹钟和启动服务的问题。

我在一项活动中设置闹钟:

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);
            }
        });
    }
}

但这不起作用,它继续搜索位置。

任何线索?

感谢。

4 个答案:

答案 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;
}