无论我如何尝试,我都无法让alarmManager和接收器工作 - 似乎有很多不同的方法可以从我搜索的内容中做到这一点,但似乎没有任何效果。
我有Manifest:
<receiver android:name="AlarmReceiver" />
我正在使用broadcastReceiver的内部类:
private class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("ALARM","TRIGGERED");
Notification(filteredList.get(0).getTitle());
}
}
我调用函数SetAlarm来启动管理器:
private void SetAlarm(long time) {
AlarmManager alarm_mgr = (AlarmManager)(this.getSystemService( Context.ALARM_SERVICE ));
Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
//PendingIntent pi = PendingIntent.getService(MainActivity.this, 0, intent, 0);
PendingIntent pi = PendingIntent.getBroadcast(this, 111, intent, PendingIntent.FLAG_UPDATE_CURRENT);
Calendar calendar = Calendar.getInstance();
alarm_mgr.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pi);
Log.d("ALARMSET", "Alarm " + calendar.getTime().toString());
}
正如你所看到的,在接收器中我有一个通知电话 - 我不会发帖,因为我知道这有用,但是还有一个不起作用的日志。 出于测试目的,我使用日历功能将时间设置为当前时间。 你可以看到pendingIntent,我已经尝试了getService和getBroadcast,我无法弄清楚我需要哪个,但无论如何都无法工作。
我确定我错过了什么,我不知道是什么,而且我似乎无法在谷歌找到任何答案。
AlarmReceiver是否可以作为内部类?我把它放在那里因为我需要访问我的“filteredList”List对象。
THX
答案 0 :(得分:1)
我正在使用broadcastReceiver的内部类:
这不起作用。 Android必须能够创建BroadcastReceiver
的实例,但不能这样做。最好,您的BroadcastReceiver
可以是静态嵌套类,但是您必须修复清单条目以引用外部类:
<receiver android:name="OuterClass$AlarmReceiver" />
答案 1 :(得分:0)
不,实际上BroadcastReceiver
需要公开。只有这样您才能在清单中注册并访问它们。将AlarmReceiver代码放在单独的.java文件中。您将在BroadcastReceiver
。
答案 2 :(得分:0)
试试这个
private AlarmManager alarmMgr;
private PendingIntent alarmIntent;
...
alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
// Set the alarm to start at 8:30 a.m.
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 8);
calendar.set(Calendar.MINUTE, 30);
// setRepeating() lets you specify a precise custom interval--in this case,
// 20 minutes.
alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
1000 * 60 * 20, alarmIntent);
了解更多详情..查看this
答案 3 :(得分:0)
我为这个问题坚持了一天,最后解决了这个问题。
AlarmManager用于每30秒生成一次广播,广播接收器用于接收消息并执行......
所以主要问题是以下两个步骤
<receiver android:name="com.istep.gps.straight.MyTimerReceiver">
<intent-filter>
<action android:name="com.istep.gps.straight.MyTimerReceiver.Action"/>
</intent-filter>
</receiver>
private void initTimer(Context context) {
Intent intent = new Intent().setAction("com.istep.gps.straight.MyTimerReceiver.Action")
.putExtra("id",UniqueID.getID(context));
PendingIntent sender = PendingIntent.getBroadcast(context, 18, intent, 0);
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 1000 * 30, sender);
}
答案 4 :(得分:0)
使用日历时,您应该setTimeInMillis
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());