接收器在初始 运行 后几秒触发
Receiver triggers a few seconds after initial run
我有这个WakefulBroadcastReceiver
public class UpdateAlarmReceiver extends WakefulBroadcastReceiver {
private AlarmManager alarmMgr;
private PendingIntent alarmIntent;
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectivityManager = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE );
NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
if (activeNetInfo != null && activeNetInfo.isConnectedOrConnecting()) {
Intent service = new Intent(context, UpdateSchedulingService.class);
startWakefulService(context, service);
}
}
public void setAlarm(Context context) {
alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, UpdateAlarmReceiver.class);
alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
final Random r = new Random();
final int hour = r.nextInt(24-9) + 9;
final int minute = r.nextInt(60-1) + 1;
final int second = r.nextInt(60-1) + 1;
final Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
//calendar.set(Calendar.SECOND, second);
Toast.makeText(context,"Freq set to: "+Integer.toString(hour)+":"+Integer.toString(minute)+":"+Integer.toString(second),Toast.LENGTH_SHORT).show();
alarmMgr.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(),
AlarmManager.INTERVAL_HALF_DAY, alarmIntent);
ComponentName receiver = new ComponentName(context, UpdateBootReceiver.class);
PackageManager pm = context.getPackageManager();
pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
}
当我第一次 运行 应用程序时,我会调用 setAlarm()
方法并默认激活闹钟管理器。但是在初始应用程序 运行 之后,接收者 onReceive
在几秒钟后被触发,即使初始时间设置为 day.I 的另一个时间段也无法理解为什么它被触发以及如何被触发避免它。
如果您过去设置了闹钟,它会立即触发。
您使用
final Random r = new Random();
final int hour = r.nextInt(24-9) + 9;
final Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, hour);
这会将日历设置为当前时间,如果
- 时间是现在之前,会在前的同一天立即触发,或者
- 时间在后,当天触发,到指定时间
你应该add
你的日历时间,而不是你自己设置,或者改进你的计算,以消除这个错误。
我有这个WakefulBroadcastReceiver
public class UpdateAlarmReceiver extends WakefulBroadcastReceiver {
private AlarmManager alarmMgr;
private PendingIntent alarmIntent;
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectivityManager = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE );
NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
if (activeNetInfo != null && activeNetInfo.isConnectedOrConnecting()) {
Intent service = new Intent(context, UpdateSchedulingService.class);
startWakefulService(context, service);
}
}
public void setAlarm(Context context) {
alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, UpdateAlarmReceiver.class);
alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
final Random r = new Random();
final int hour = r.nextInt(24-9) + 9;
final int minute = r.nextInt(60-1) + 1;
final int second = r.nextInt(60-1) + 1;
final Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
//calendar.set(Calendar.SECOND, second);
Toast.makeText(context,"Freq set to: "+Integer.toString(hour)+":"+Integer.toString(minute)+":"+Integer.toString(second),Toast.LENGTH_SHORT).show();
alarmMgr.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(),
AlarmManager.INTERVAL_HALF_DAY, alarmIntent);
ComponentName receiver = new ComponentName(context, UpdateBootReceiver.class);
PackageManager pm = context.getPackageManager();
pm.setComponentEnabledSetting(receiver,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
}
当我第一次 运行 应用程序时,我会调用 setAlarm()
方法并默认激活闹钟管理器。但是在初始应用程序 运行 之后,接收者 onReceive
在几秒钟后被触发,即使初始时间设置为 day.I 的另一个时间段也无法理解为什么它被触发以及如何被触发避免它。
如果您过去设置了闹钟,它会立即触发。
您使用
final Random r = new Random();
final int hour = r.nextInt(24-9) + 9;
final Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, hour);
这会将日历设置为当前时间,如果
- 时间是现在之前,会在前的同一天立即触发,或者
- 时间在后,当天触发,到指定时间
你应该add
你的日历时间,而不是你自己设置,或者改进你的计算,以消除这个错误。