首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android Alarm Manager无法工作

Android Alarm Manager无法工作
EN

Stack Overflow用户
提问于 2012-11-20 21:23:37
回答 2查看 2.3K关注 0票数 2

所以我有一个看起来像这样的BroadcastReceiver

代码语言:javascript
复制
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的方式

代码语言:javascript
复制
 Intent in = new Intent ("REFRESH_BROADCAST");       
 sendBroadcast(in);

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

代码语言:javascript
复制
<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出了问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-21 00:33:41

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

我将int type设置为AlarmManager.ELAPSED_REALTIME,将long triggerAtMillis设置为alarmManager.setInexactRepeating(.....)System.currentTimeMillis()属性,这是错误的,它只能与AlarmManager.RTC / RTC_WAKEUP成对出现。

所以函数代码是这样的:

代码语言:javascript
复制
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);

我真的应该更仔细地阅读API文档。如果你悬停在AlarmManager.ELAPSED_REALTIME上,它会告诉你你必须使用哪种时间触发器。希望我犯的这个愚蠢的错误将来能帮助到别人。

票数 3
EN

Stack Overflow用户

发布于 2012-11-20 21:32:11

根据setInexactRepeating文档,第三个参数是:

intervalMillis: alarm

后续重复之间的间隔(毫秒

然后你应该用10000 ms ( 10秒)代替cal.getTimeInMillis()

代码语言:javascript
复制
alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, cal.currentTimeMillis(), 10000, operation);

这意味着,你的警报将在意图发射10秒后响起,然后每10秒重复一次。当然,由于您正在使用此方法,因此这是不精确的时机。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13474186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档