2011-04-17 93 views
0

我使用了一項服務來更新一個appwidget,並且還安排了定期更新的重複警報(即它仍然調用服務類)。我現在的問題是,我不知道如何取消報警,並在主屏幕上刪除appwidget時停止服務。我已經嘗試取消appwidget的onDeleted()中的警報,它具有與創建警報相同的掛起意圖,但未取消它。如何取消服務中的鬧鐘?

下面是服務的時間表代碼:

public void onDeleted(Context context, int[] appWidgetIds) { 

    for (int appWidgetId : appWidgetIds) { 
    //cancel the alarm 
    Intent widgetUpdate = new Intent(); 
    //widgetUpdate.setClassName(this, appService.class); 
    //Uri data = Uri.withAppendedPath(Uri.parse(URI_SCHEME + "://widget/id/"), 
    // String.valueOf(appWidgetId)); 
    //widgetUpdate.setData(data); 
    PendingIntent newpending = PendingIntent.getService(context, 0, widgetUpdate, 
     PendingIntent.FLAG_UPDATE_CURRENT); 

    AlarmManager alarm = 
     (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
    alarm.cancel(newpending); 
    //cancel the service 
    context.stopService(new Intent(context,WeatherService.class);  
    } 
    super.onDeleted(context, appWidgetIds); 
} 

請你能指出,如果我做錯了什麼:

Intent widgetUpdate = new Intent(); 
widgetUpdate.setClass(this, appService.class); 
//widgetUpdate.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 
widgetUpdate.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[]{appWidgetId}); 
//widgetUpdate.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); 
Uri data = Uri.withAppendedPath(Uri.parse(URI_SCHEME + "://widget/id/"), 
    String.valueOf(appWidgetId)); 
widgetUpdate.setData(data); 

PendingIntent newpending = PendingIntent.getService(this, 0, widgetUpdate, 
    PendingIntent.FLAG_UPDATE_CURRENT); 

AlarmManager alarm = (AlarmManager)getSystemService(ALARM_SERVICE); 
alarm.setRepeating(AlarmManager.ELAPSED_REALTIME, 
    SystemClock.elapsedRealtime()+ updateRate, updateRate, newpending); 
在appWidgetProviderClass的onDeleted()

呢?謝謝。

只是一個側面說明,已經離開那些評論代碼,只是爲了讓你知道我也試過了。

回答

1

您需要使用PendingIntentcancel(),它與setRepeating()所用的值相同。換句話說:

  • 如果您呼籲setRepeating()IntentsetClass(),你需要呼籲cancel()意向
  • 相同setClass()如果您在setRepeating()IntentsetAction(),需要調用同一setAction()cancel()意圖
  • 如果您在setRepeating()IntentsetData(),你需要調用同一setData()cancel()我意圖

其他並不重要,但組件(類),操作,數據(Uri)和MIME類型都是重要的。

+0

gosh謝謝,我現在可以享受我的星期日,我想知道我做錯了什麼。順便說一句,如果我可能會問,你認爲它是一個很好的設計或想法,在服務類中安排重複報警。我試過在配置類中做,但從未發生過。我不知道它是否因爲配置類調用這個服務類。 – user712109 2011-04-17 13:20:35

+0

@ user712109:對不起,我無法在摘要中回答這個問題。我不知道「配置類」是什麼,等等。 – CommonsWare 2011-04-17 13:31:18

+0

哦,對不起,我的意思是用戶設置配置類的更新率,這就是警報如何獲得計劃的價值;來自首選項,因爲配置類必須從服務類中最初更新小部件。但因爲它不是問題的一部分,所以不會因此而打擾你。再次感謝 – user712109 2011-04-17 13:54:22