广播接收器从AlarmManager没有得到所谓的(BroadcastReceiver from A

2019-10-21 06:28发布

我有一个延伸的类IntentService 。 当我的应用程序重新启动(并在应用程序启动时),在这个类的东西被调用。 它加载一些设置,并做一些事情的背景(这是一种生产力工具/实用程序)。

IntentService ,我装的时候,我们称之为“东西”,来决定是否通过添加一些警报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 S是相同的(都是有类型的动作演员,以及一个ID)。

我究竟做错了什么? 另外,什么是去更合适的方式已经从-基于报警? 由此,我的意思是我需要一些方法在某一时间发生,和不同的方法(在同一类;控制器BroadcastReceiver )中的“结束”的时间。

Answer 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中的BroadcastReceiver我打电话getAction()返回一个字符串)。 瞧! 两个报警器断火如预期,我就能采取行动的类型和执行我的相关方法。

注:@Chitrang的帮助下回答(通过评论的问题)。 指出, Intent渐渐取消,因为已经有安排了报警IntentSender



文章来源: BroadcastReceiver from AlarmManager not getting called