首页 > 解决方案 > AlarmManager 没有调用 onReceive

问题描述

我打开这个主题是因为我遇到了应用程序通知问题;FirebaseMessagingService:手机睡眠时没有通知 我在我的项目中使用 AlarmManager 在 1 分钟内运行它,但是当我想打印日志时,我意识到它工作不正常。广播不会以任何方式响应。是什么原因?

问候

public class WOnTrackerReceiver extends BroadcastReceiver {

    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    public void onReceive(Context ctxt, Intent i) {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.SECOND, 10);

        Intent intent = new Intent(ctxt, WOnTrackerFirebaseMessagingService.class);

        PendingIntent pintent = PendingIntent.getService(ctxt, 0, intent, 0);

        AlarmManager alarm = (AlarmManager) ctxt.getSystemService(Context.ALARM_SERVICE);

        //for 1 mint 1*60*1000
        alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
                1*60*1000, pintent);

    }
}

安卓清单:

Permission: 
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

  <receiver android:name="com.myproject.receivers.WOnTrackerReceiver">
        android:directBootAware="true"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />

        </intent-filter>
    </receiver>

标签: javaandroidfirebase-cloud-messagingbroadcastreceiver

解决方案


您不能使用AlarmManager该速率获得重复警报。一般来说,2分钟是绝对最低限度,许多制造商有更严格的限制。

如果需要以该频率运行代码,则应使用Handlerand 。postDelayed()

此外,setRepeating()不能可靠地按时交付。您可以使用其他方法AlarmManager来获得更准确的计时。但正如我所说,频率不会低于 2 分钟。

此外,您问为什么AlarmManager没有调用您的BroadcastReceiver,但是您发布的代码片段每分钟 都使用( )AlarmManager开始,而不是调用您的. 你困惑吗?ServiceWOnTrackerFirebaseMessagingServiceBroadcastReceiver


推荐阅读