Android SetInexactRepeating根本没有触发

Let*_*man 4 android repeat alarmmanager android-intent android-pendingintent

我有一个安装在我的onCreate里面的android setInexactRepeating,它永远不会触发.我在其中有一个日志,以确保它实际上正在执行,并且似乎没有触发,以及我为它计划的事件.我希望它每隔10秒就会消失一次,但它甚至连第一次都没有消失.

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Log.d("Restart", "First");
    Intent toRun = new Intent(this, AlarmRestart.class);
    PendingIntent pendingToRun = PendingIntent.getBroadcast(this, 0, toRun, 0);
    AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
    am.cancel(pendingToRun); 
    am.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, System.currentTimeMillis(), 10000L, pendingToRun);

    Log.d("Restart", "Second");
}
Run Code Online (Sandbox Code Playgroud)

这是在另一个文件中:

public class AlarmRestart extends BroadcastReceiver {
    public void onReceive(Context context, Intent intent) {
        Log.d("Restart", "Third");
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是"adb shell dumpsys alarm"所说的

com.packageName.restart
5715ms running, 64 wakeups
3 alarms: flg=0x14 cmp=com.packageName.restart/.AlarmRestart
61 alarms: flg=0x14 cmp=com.packageName.restart/.reciever.AlarmRestart
Run Code Online (Sandbox Code Playgroud)

Com*_*are 8

AlarmRestart是一个BroadcastReceiver.它不是Service.但你正试图用一个getService() PendingIntent.那样不行.更改getService()getBroadcast(),你应该有更好的运气.

  • @Lethjakman:首先,您也可以切换到`setRepeating()`,因为您不能不精确地重复任意间隔,只能在`setInexactRepeating()`的文档中列出.其次,您可能希望将第一次出现的时间安排在将来.除此之外,从命令行使用`adb shell dumpsys alarm`来获取所有已注册的`AlarmManager`警报的日志,并查看您的应用程序的内容. (2认同)

Let*_*man 5

我发现了问题:/

        <reciever android:name="com.appName.restart.AlarmRestart" android:enabled="true" />
Run Code Online (Sandbox Code Playgroud)

它的拼写是接收器……不是接收器。说真的,XML 需要一个错误检查器。我仍然将 CommonWares 的答案标记为已接受的答案,因为他解决了我稍后会遇到的其他几个问题。