我希望以regular
的间隔向服务器发送数据。所以,我正在使用AlarmManager
。它工作正常,但问题是当cancel
Date/Time
上的警报发生变化时。此时警报会在取消之前再次触发,因此extra
数据以server
间隔发送到irregular
会使我的应用程序变得更糟。
以下是我的BroadCastReceiver
课程AlarmManager
。
public class MyReceiver extends BroadcastReceiver{
AlarmManager mgr;
PendingIntent pi;
Intent intent;
public static boolean flag = false;
@Override
public void onReceive(final Context arg0, Intent arg1) {
if(arg1.getAction().equals("android.intent.action.TIME_SET")){
Log.d("MyReceiver", "Time set");
mgr = (AlarmManager) arg0.getSystemService(Context.ALARM_SERVICE);
intent = new Intent(arg0, TestService.class);
intent.putExtra("test", "testvalue");
pi = PendingIntent.getService(arg0, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
if(!flag){
mgr.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 10000, 5000, pi);
flag = true;
}
else{
mgr.cancel(pi);
pi.cancel();
flag = false;
}
}
}
}
下面是带有Logcat输出的屏幕截图,它解释了在取消警报后,它会在取消后再次触发。
正如您在Logcat
输出black arrow
中看到的那样,我在那里更改了取消闹钟的时间,而red arrow
显示在取消闹钟之后再次取消它之前取消了不应该发生。所以,任何人都可以告诉我为什么会这样,我应该怎样做restrict
警告在取消之前再次被解雇。
注意: - 只有在我尝试从10:00到11:00增加日期/时间时才会发生这种情况,当我减少10:00到9:00的时间时效果很好。 < / p>
答案 0 :(得分:0)
无法在我的最后看到LogCat,但是查看代码,我不确定,被调用的服务(TestService)如何被杀死/停止?我想你需要以某种方式阻止它。此外,不建议在广播接收器内执行长时间运行的任务。 您是否确认在mgr.cancel(pi)被解雇后发生了服务停止事件?
答案 1 :(得分:0)
尝试在活动中使用一些具有待定意图的唯一代码,然后使用相同的代码取消该意图。
在活动中设置待处理意图
PendingIntent.getBroadcast(this, code ,intent,PendingIntent.FLAG_UPDATE_CURRENT);
停止广播接收器
PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), code ,intent,0); AlarmManager alarmManager =(AlarmManager)getSystemService(Context.ALARM_SERVICE); alarmManager.cancel(的PendingIntent);
答案 2 :(得分:0)
为什么会这样?
首先,你正在使用Intent Action android.intent.action.TIME_SET
所以它确实意味着每次如何系统日期/时间如何变更你的BroadcastReceiver将自动调用。
其次,您在static boolean flag
课程中使用了一个Receiver
。
现在正在发生的事情是每当您更改系统时间时,该标志会从false to true
和true to false
切换状态。
这就是你的代码中正好发生的事情,而logcat也显示了根据编写的代码一切正常工作的情况。
所以根据我的说法,没有代码中出现了错误的输出。
what should I do to restrict Alarm getting fired again before cancelling
首先我认为,你不应该像这样使用Action TIME_SET来打开/关闭标记,因为用户和开发人员可能不记得他们是什么更改时间以打开或关闭FLAG,
更好的方式, 您应该通过Activity自己处理服务并在那里显示一个ToggleButton来管理FLAG的状态并设置和取消PendingIntent。
或强>
如果您想自动执行您的服务任务,您只需使用AlarmManager
并设置您的警报触发时间和间隔只有一次说时间是当前时间而间隔是50000毫秒..
所以它显然会在每5分钟后从现在开始调用服务,然后在你的应用程序中你将只需要一个ToggelButton来指示同步到服务器是打开还是关闭,如果用户切换它打开或关闭仅在toggleButtontb.setOnCheckedChangeListener(listener)
中在您的活动中编写您的AlarmManager代码,我想这是更好的方式然后您实际执行的内容。< / p>
答案 3 :(得分:-1)
如果您的目标只是定期在服务器上发送数据,我不明白需要为日期更改设置接收器。
更改设备的日期和时间并不意味着您的闹钟无法正常工作 在那些你已经在这些变化之前设置的时间。
Alarmmanager
在给定的持续时间内工作,该时间不包括设备的当地当前日期和时间。