AlarmReceiver 永远不会收到来自 Fragment 的调用

AlarmReceiver never receives a call from Fragment

我正在尝试在 Fragment 中设置闹钟。

AlarmManager manager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);

Intent alarmIntent = new Intent(getActivity(), AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getService(getActivity(), 0, alarmIntent, 0);

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 19);
calendar.set(Calendar.MINUTE, 23);

manager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 1000 * 60 * 3600, pendingIntent);

而我的 AlarmReceiver class 是:

public class AlarmReceiver extends BroadcastReceiver {
    private static final String TAG = "MainFragment";
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i(TAG, "onReceive");
        Toast.makeText(context, "I'm running", Toast.LENGTH_LONG).show();
    }
}

此日志和 toast 从未显示。

在我的Android我的清单中

<receiver android:name=".AlarmReceiver"
            android:enabled="true"
            android:exported="true"></receiver>

我错过了什么吗?这是我在 Android 中的第一个项目,所以它可能是新手犯的错误。

您正在使用 PendingIntent.getService(...),而不是等效的 BroadcastReceiver PendingIntent.getBroadcast(...)。这可能是问题所在。

确保如果您设置了一次闹钟(比如在 App 首次启动时),并且在等待期间您对代码进行了一些更改并再次安装了该 App,您的待定 intent 不再处于活动状态,因此您需要设置闹钟再次.

这是经过测试的示例:

AlarmManager manager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);

Intent alarmIntent = new Intent(this.getApplicationContext(), AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.SECOND, 30);

manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 1000 * 60 * 3600, pendingIntent);

如果不行我可以把我做的工作项目发给你。