传递给未决意图时,静态方法中的意图为空

intent in static method is null when passed to pending intent

我目前几乎完成了我正在开发的应用程序,除了一个新的障碍。

我的应用程序包括一个按预期触发的服务警报,其中的意图在它们设置的确切时间工作,其他一切工作正常。但是,我的应用程序有菜单按钮,可让您打开和关闭它。它在 IntentService 中调用此方法来检查它是否应显示为 "Turn Alarm On" 或 "Turn Alarm Off",具体取决于返回的布尔值是什么。用户的选择(他们希望它打开或关闭)也保存在共享首选项中,这也从我的日志语句告诉我的内容中正确保存。问题是,当设备重置时,应用程序中的所有内容都正常工作,首选项已保存,除了此方法 returns 在应用程序首次 运行 重置后为 false,因此菜单项不会正确更新。

在重置时,菜单按钮显示 "Turn Alarm On",即使它实际上已经打开,因为下面的方法返回 false。如果我单击一次,警报将关闭,但文本不会更改,但按钮可以正常工作。如果我第二次单击它,next 会按预期更改为 "Turn Alarm Off",闹钟会重新打开,然后按预期工作。下面是有问题的方法,调试时显示我创建的意图中的所有内容在传递到 PendingIntent 时都是空的,但我不明白为什么。

public static boolean isServiceAlarmOn(Context context)
    {
        Intent i = new Intent(context.getApplicationContext(), CommuteCheckAlarmService.class);
        PendingIntent pi = PendingIntent.getService(context, 0, i, PendingIntent.FLAG_NO_CREATE);
        Log.i(ALARM_SERVICE, "Checking isServiceAlarmOn, pi is NOT null is " + (pi != null) + "and the intent is not null" + (i != null));
        return pi != null;
    }

有没有人知道是什么导致了设备重置时的这种行为?我在模拟器上 运行 设置它,关闭闹钟的首选项也正确保存。

更新:当我通过 运行 作为 Android 应用程序 运行 在模拟器上运行我的应用程序时,而不是仅仅打开模拟设备并开始设备内的应用程序就像普通用户一样。有谁知道为什么上述行为特别发生在 运行 As Android 应用程序期间?

当设备重新启动或您的应用被卸载时,其所有 PendingIntent 和闹钟都将被删除。这是正常行为。