我有一个扩展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
)。
答案 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
安排了警报。