Android Alarm Manager无效

时间:2012-11-20 13:23:37

标签: android alarmmanager android-pendingintent

所以我有BroadcastReceiver,如下所示:

public class UpdateReceiver extends BroadcastReceiver {

    public UpdateReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.SECOND, 10);
        System.out.println("Broadcast received");       

        PendingIntent operation = PendingIntent.getService(context, 0,new Intent("REFRESH_THAT"), PendingIntent.FLAG_UPDATE_CURRENT);       
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, System.currentTimeMillis(), cal.getTimeInMillis(), operation);
    }
}

这就是我调用BroadcastReceiver

的方法
 Intent in = new Intent ("REFRESH_BROADCAST");       
 sendBroadcast(in);

这是Android Manifest文件中的意图过滤器

<service android:name = ".services.RefreshService">     
    <intent-filter>
        <action android:name="REFRESH_THAT"/>
    </intent-filter>
</service>

<receiver android:name=".services.UpdateReceiver">        
    <intent-filter>
        <action android:name="REFRESH_BROADCAST"/>        
    </intent-filter>    
</receiver>

BroadcastReceiver收到了一个没有任何问题的广播,但AlarmManager似乎什么也没做。如果我致电operation.send()它没有问题,我认为AlarmManager有问题。

2 个答案:

答案 0 :(得分:3)

好吧,所以最后我找到了一个解决方案,这是我的错。

我已将int type设置为AlarmManager.ELAPSED_REALTIME,将long triggerAtMillis设置为System.currentTimeMillis()属性alarmManager.setInexactRepeating(.....)这是错误的,它只能与{{1}配对}。

所以功能代码是这样的:

AlarmManager.RTC / RTC_WAKEUP

我应该更仔细地阅读API文档。如果你悬停PendingIntent operation = PendingIntent.getService(context, 0,new Intent("REFRESH_THAT"), 0); AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime() , 30000, operation); ,它会告诉你必须使用什么样的时间触发器。希望这个我的愚蠢错误将来会帮助别人。

答案 1 :(得分:0)

根据setInexactRepeating doc,第三个参数是:

  
    

intervalMillis:后续重复警报之间的间隔(以毫秒为单位)

  

然后你应该10000 ms(10秒)而不是cal.getTimeInMillis()

alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, cal.currentTimeMillis(), 10000, operation);

这意味着,你的警报会在意图射击10秒后熄灭,然后每10秒重复一次。当然,既然你正在使用这种方法,那么这是不准确的时机。