来自AlarmManager的BroadcastReceiver未被调用

时间:2014-11-08 18:26:15

标签: android service broadcastreceiver alarmmanager intentservice

我有一个扩展IntentService的课程。当我的应用程序重新启动时(以及应用程序启动时),会调用此类中的内容。它加载一些设置并在后台执行一些操作(它是一个生产力工具/实用程序)。

这个IntentService,在加载我的时候,我们称之为“stuff”,决定是否通过AlarmManager添加一些警报。我有一个BroadcastReceiver接收一些不同的参数,并根据这些参数做一些方法。这是我安排警报的代码:

public void addAlarm(int id, int hourFrom, int hourTo, int minuteFrom, int minuteTo)
{
    AlarmManager alarmManager = (AlarmManager) getBaseContext().getSystemService(Context.ALARM_SERVICE);
    // Enable
    Intent intent = new Intent(Controller.KEY_CONTROLLER_ACTION);
    intent.putExtra(Controller.KEY_CONTROLLER_ACTION, Controller.KEY_ACTION_ENABLE);
    intent.putExtra(Controller.KEY_CONTROLLER_ID, id);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(
            this,
            id,
            intent,
            PendingIntent.FLAG_UPDATE_CURRENT);
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY, hourFrom);
    calendar.set(Calendar.MINUTE, minuteFrom);
    calendar.set(Calendar.SECOND, 00);
    int hours_24 = 24 * 60 * 60 * 1000;
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), hours_24, pendingIntent);

    // Cancel
    Intent cancelIntent = new Intent(Controller.KEY_CONTROLLER_ACTION);
    intent.putExtra(Controller.KEY_Controller_ACTION, Controller.KEY_ACTION_END);
    intent.putExtra(Controller.KEY_Controller_ID, id);
    PendingIntent cancelPendingIntent = PendingIntent.getBroadcast(
            this,
            id,
            cancelIntent,
            PendingIntent.FLAG_UPDATE_CURRENT);
    calendar.set(Calendar.HOUR_OF_DAY, hourTo);
    calendar.set(Calendar.MINUTE, minuteTo);
    calendar.set(Calendar.SECOND, 00);
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), hours_24, cancelPendingIntent);

问题在于:BroadcastReceiver(控制器类)只有有时onReceive被调用。当它发生时,它会延迟几分钟(没什么大不了的;但这是一个很多次它永远不会被调用的问题)。 第二个警报( cancelIntent 从不被调用。

我的控制器 BroadcastReceiver已正确声明清单。我怀疑这与Intent两个相同(两者都有行动类型的附加物以及ID)有关。

我做错了什么?或者,有哪些正确的方法可以实现基于从头到尾的警报?通过这个,我的意思是我需要在某个时间发生某种方法,并在“结束”时间使用不同的方法(在同一个类中;控制器BroadcastReceiver)。

1 个答案:

答案 0 :(得分:1)

我修改了我的清单以采取多项操作(真实操作,而非我通过addExtra执行的伪操作)。

<receiver android:name="com.mycompany.myapp.Controller">
        <intent-filter>
            <action android:name="com.mycompany.myapp.Controller.START"/>
        </intent-filter>
        <intent-filter>
            <action android:name="com.mycompany.myapp.Controller.END" />
        </intent-filter>
    </receiver>

然后,当我使用Intent添加警报时,我确保调用setAction,指定字符串操作。在onReceive的{​​{1}}我调用BroadcastReceiver(返回一个字符串)。瞧!两个警报都按预期启动,我可以获取操作类型并执行我的相关方法。

注意:在@Chitrang的帮助下回答(通过对问题的评论)。指出getAction()已被取消,因为已为Intent安排了警报。