2

我有一个android setInexactRepeating置于我的onCreate中,永远不会触发。我在里面有一个日志,以确保它实际上正在执行,这似乎并没有触发,以及我为它计划的事件。我希望它每隔10秒就会关闭一次,但即使是第一次,它也不会消失。Android的SetInexactRepeating根本没有发射

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"); 
} 

这是在其他文件:

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

这就是 “亚行外壳dumpsys报警说:”

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 
+0

能'alarm.cancel()'是问题的一部分? – eternalmatt 2012-07-30 19:24:06

+0

感谢您的建议!这应该只是取消以前的setInexactRepeating,我没有它尝试过,仍然有相同的效果。 – Lethjakman 2012-07-30 19:26:53

回答

4

我发现这个问题:/

 <reciever android:name="com.appName.restart.AlarmRestart" android:enabled="true" /> 

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

+0

是的,我哑巴的同事做了同样的事情,我们看了一个小时。 – lostintranslation 2014-04-23 20:50:56

8

AlarmRestartBroadcastReceiver。这不是Service。但是,您正在尝试使用getService()PendingIntent。这是行不通的。将getService()改为getBroadcast(),你应该有更好的运气。

+0

这是我绝对没有意识到有一个区别。谢谢。我正在修改我的代码以反映您的建议,但它仍然跳过广播接收器而没有错误消息。 – Lethjakman 2012-07-30 20:20:50

+2

@Lethjakman:首先,你可以切换到'setRepeating()',因为你不能做任意时间间隔的不精确重复,只能在'setInexactRepeating()'的文档中列出。其次,你可能想要安排第一次出现在未来。除此之外,使用命令行中的'adb shell dumpsys alarm'来获取所有已注册的'AlarmManager'警报的日志,并查看您的应用程序有哪些内容。 – CommonsWare 2012-07-30 20:25:35

+0

我正在寻找一个这样的命令!我开始认为它不存在!虽然它更吸引人,但它说我的应用程序已经唤醒了335次......这绝对是一个巨大的帮助。非常感谢。 – Lethjakman 2012-07-30 20:38:20

1

您可以在ELAPSED_REALTIME_WAKEUP报警使用SystemClock.elapsedRealtime(),而不是System.currentTimeMillis的()