有人可以解释一下AlarmManager这种奇怪的行为吗?

时间:2011-04-23 20:17:59

标签: android alarm alarmmanager

以下是一个简单的警报调用程序,请注意我想要捕获的鳟鱼数量:

    private void setReminder() {
        Intent intent = new Intent(this, AlarmReceiver5.class);
        int trout = 21;
        intent.putExtra("intData", trout);
        intent.putExtra("textData", 
            "Great day for fishing! How many trout you want to get today? ");
        PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0);

        AlarmManager am = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 15 * 1000, sender);
    }
  1. 当我第一次运行它时,BroadcastReceiver正确地看到我今天想要捕获21条鳟鱼。

  2. 我在Eclipse中将数字更改为22,再次运行,接收器仍然看到21!无论我如何在这里尝试,包括从Android卸载程序,接收器总是得到旧数字。

  3. 现在,如果我将接收器类从AlarmReceiver5重命名为AlarmReceiver6,那么它可以成功获取不同的数字。但是同样的事情又发生了,也就是说,无论我如何改变数字,接收者总是得到旧数字,直到我重命名这个类。

  4. 但是,如果我更改Bundle中的元素名称(即上例中的“intData”和“textData”),接收器根本无法获得任何内容!数字变为0.当然,我相应地更新了接收方。

  5. 即使我使用了ApiDemo的AlarmController和OneShotAlarm类,上面也是如此。

  6. 现在,如果我稍微调整一下代码,我在设置下一个警报之前取消了警报,然后接收器没有得到任何东西,数字为0.请参阅下面的代码:

        private void setReminder() {
            AlarmManager am = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
            Intent intent = new Intent(this, AlarmReceiver5.class);
            // Cancel the alarm
            PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0);
            am.cancel(sender);
    
            // Then set it again (using a newly created PendingIntent).
            sender = PendingIntent.getBroadcast(this, 0, intent, 0);
            int trout = 21;
            intent.putExtra("intData", trout);
            intent.putExtra("textData", 
            "Great day for fishing! How many trout you want to get today? ");
            sender = PendingIntent.getBroadcast(this, 0, intent, 0);
            am.cancel(sender);
            am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 15 * 1000, sender);
    }
    

    有人可以解释一下Android AlarmManager的黑客攻击方式吗?谢谢! (我可能几个小时都没能看到你的回复,因为我在发布之后就去钓鱼了。)

1 个答案:

答案 0 :(得分:1)

PendingIntent.getBroadcast中的

(this,0,intent,0);将flag参数(4th)设置为http://developer.android.com/reference/android/app/PendingIntent.html

中的一个常量