2011-09-30 116 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; 
}