簡體   English   中英

Android AlarmManager.cancel()並未實際取消警報/ PendingIntent

[英]Android AlarmManager.cancel() not actually cancelling alarm/PendingIntent

試圖取消AlarmManager警報,效果不佳。

我創建一個PendingIntent像這樣:

static PendingIntent makePendingIntent(int id, Bundle bundle)
{
    Intent intent = new Intent(mContext.getApplicationContext(), mfLocalNotificationManager.class);
    if(bundle != null)
    {
        intent.putExtra(BUNDLE_ID, bundle);
    }

    return PendingIntent.getBroadcast(mContext.getApplicationContext(), id, intent, PendingIntent.FLAG_UPDATE_CURRENT);

}

從SendLocalNotification調用:

public static int SendLocalNotification(String title, String text, String tickerText, 
        int timeSent, int timeOffset, String sound)
{

    AlarmManager alarmMgr = 
        (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE);   

    Bundle notificationData = new Bundle();
    notificationData.putString("title", title);
    notificationData.putString("text", text);
    notificationData.putString("tickerText", tickerText);
    /*snip, bundle stuff*/

    int noteID = title.hashCode();        

    notificationData.putInt("noteID", noteID);

    PendingIntent pendingIntent = makePendingIntent(noteID, notificationData);

    if( pendingIntent == null )
    {
            //This should probably be flagged as an error or an assertion. 
        Log.d("[MF_LOG]", "Java intent is null");
            return -1;
    }

    //This isn't my timing code, don't hate me for it
    Calendar time = Calendar.getInstance();
    time.setTimeInMillis(System.currentTimeMillis());
    time.add(Calendar.SECOND, timeOffset);

    alarmMgr.set(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(),
                 pendingIntent);

return noteID;
}

然后嘗試取消它(傳遞我們先前從SendLocalNotification返回的ID):

public static void CancelNotification(int id)
{
    String ns = Context.NOTIFICATION_SERVICE;

    AlarmManager alarmMgr = 
            (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE);

    PendingIntent pendingIntent = makePendingIntent(id, null);

    //This doesn't work...
    pendingIntent.cancel(); //<- added based on SO post, doesn't help
    alarmMgr.cancel(pendingIntent);
}

似乎沒有任何效果,並且我在其他帖子上遵循了盡可能多的建議(確保ID相同,確保重新創建PendingIntent完全相同),並且似乎仍然崩潰。 附帶說明一下,嘗試使用標志PendingIntent.FLAG_NO_CREATE檢查通知是否存在也不起作用,而是創建一個新對象而不是返回null。

我正在此設備上測試的設備是Nexus 7,並且正在針對API 9進行構建。

您需要重新創建您的意圖,並像這樣取消它:

AlarmManager alarm = (AlarmManager) context.getSystemService(ALARM_SERVICE);
PendingIntent peding = PendingIntent.getActivity(context, code, intent,     
                                                 PendingIntent.FLAG_CANCEL_CURRENT);
alarm.cancel(peding);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM