2011-09-30 105 views
2

我在取消警报和启动的服务时遇到问题。无法停止使用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上获取我的位置时,我打电话给另一个活动以显示位置并发出通知。

在这个时候,我想停止搜索的位置。 所以我尝试取消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); 
      } 
     }); 
    } 
} 

但是,这不工作,它继续搜索的位置。

任何线索?

谢谢。

回答

3

你必须使意图唯一。

某物类似于:

locationPollerIntent.setData((Uri.parse("YOUR UNIQUE ID FOR THIS INTENT"))); 

AlarmManager会找回你正确的报警时,检查意图的数据字段。 只是为意图的数据设置一个唯一的Uri。

所以当你回到你的闹钟,做某事喜欢:

intentToStop.setData((Uri.parse("YOUR SAME UNIQUE ID FOR THIS INTENT"))); 

报警后应取消。

+0

感谢您的回复。 我试过了,但没有奏效。 – blui

+0

您是否在每次测试之前擦拭模拟器?也许您之前的警报仍在提取位置。并确保每个闹钟都使用唯一的ID。所以,如果你发出5次警报,你需要5个不同的ID ......只是猜测... –

1

REQUEST_CODE需要在两个地方都是一样的;您不会显示您的代码清单中定义的位置。

另外,你不需要getApplicationContext()在这里 - this将工作得很好。

+0

感谢您的答复。 – blui

+0

是的,REQUEST_CODE是一样的。 我想知道如果取消警报,它应该停止服务。 因为在调用alarmManager.cancel()之后,它会继续搜索该位置。 谢谢。 – blui

+1

@blui:“我想知道是否取消警报,它应该停止服务。” - 不。所有取消闹钟都会停止您的'PendingIntent'被调用。 – CommonsWare

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/

+0

我有同样的问题,我为意图创建了一个单例,但仍然无法工作... – Lilo

0

我有同样的问题,它不是具有意图“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; 
}