无法获得AlarmManager和广播工作

时间:2014-12-04 13:29:11

标签: android broadcastreceiver alarmmanager android-pendingintent

无论我如何尝试,我都无法让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

5 个答案:

答案 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秒生成一次广播,广播接收器用于接收消息并执行......

所以主要问题是以下两个步骤

1。在AndroidManifist.xml中需要一个动作过滤器。

<receiver android:name="com.istep.gps.straight.MyTimerReceiver">
            <intent-filter>
                <action android:name="com.istep.gps.straight.MyTimerReceiver.Action"/>
            </intent-filter>
</receiver>

2。最重要的是Intent需要为空,没有AAA.class

 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());