我正在创建一个应用程序:
如果时间范围是未来的话,一切正常(如果我的电话时间在 05:00 PM 之前):
我为此做了一个服务......
每当用户输入时间范围时,它就会启动onStart服务并覆盖onStartCommand ......
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
ArrayList<HashMap<String, String>> arraylist_start = (ArrayList<HashMap<String, String>>) intent.getSerializableExtra("arraylist_start");
if(arraylist_start != null){
try {
silentModeOnBroadCastReceiver.startAlarmAt(this, arraylist_start);
silentModeOffBroadCastReceiver.startAlarmOff(this, arraylist_start);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
在arraylist_start中,我从意图中获取时间范围列表,其中用户添加了时间范围...相同的代码写在onStartCommand
在SilentModeOnBroadCastReceiver中,我添加了startAlarmAt方法,该方法接受ArrayList并调用挂起的意图
public void startAlarmAt(Context context, ArrayList<HashMap<String, String>> list) throws ParseException {
Calendar calendar = Calendar.getInstance();
for (int j = 0; j < list.size(); j++ ){
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
String timeStart = list.get(j).get("timeStart");
date1 = Calendar.getInstance();
date2 = Calendar.getInstance();
date1.setTime(dateFormat.parse(timeStart));
Log.i("Date1Time", date1.toString());
int hours = date1.get(Calendar.HOUR_OF_DAY);
int minutes = date1.get(Calendar.MINUTE);
calendar.set(Calendar.HOUR_OF_DAY, hours);
calendar.set(Calendar.MINUTE, minutes);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
AlarmManager am =( AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, SilentModeOnBroadCastReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(context, j, i, PendingIntent.FLAG_UPDATE_CURRENT);
am.setRepeating(AlarmManager.RTC_WAKEUP, date1.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pi);
}
}
现在在SilentModeOnBroadCastReceiver
中public void onReceive(Context context, Intent intent)
{
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
wl.acquire();
// Put here YOUR code.
Toast.makeText(context, "Silent Activated !!!!!!!!!!", Toast.LENGTH_LONG).show();
Silent silent = new Silent(context);
silent.activateAudioMode(AudioManager.RINGER_MODE_SILENT);
wl.release();
}
请帮助解决我的问题...为什么BroadcastReceiver会在过去的时间初始化?
答案 0 :(得分:1)
此行为的原因是Android没有将其调用到确切的时间(除了您设置了一些特殊标志)。 Android正在这样做,以提高电池使用率。这导致Android尝试尽快为给定的属性集调用该警报侦听器。由于你的时间窗口已经启动,因此Android调用它的时间较晚,所以它做得最好并且几乎直接调用它。
因此,只需检查窗口是否在过去,如果是,请为第一次调用添加一天。我也在我的应用程序中这样做,并且它工作正常。
您可以通过以下简单的电话添加一天:
if(calendar.before(GregorianCalendar.getInstance())) {
calendar.add(Calendar.DAY_OF_MONTH, 1);
}
答案 1 :(得分:1)
这种情况正在发生,因为您正在为已经过去的时间设置闹钟。因此android在当前时间初始化广播接收器。您需要签入代码...如果时间已过,请将其设置为第二天。
在设置闹钟之前进行此检查:
if(alarm_time_in_ms < System.getCurrentTimeMillis())
{
calendar.add(Calendar.DAY_OF_MONTH, 1);
}
希望它有所帮助!
答案 2 :(得分:1)
它似乎正在做的是获取当前时间并为此设置警报。我认为你需要做的是获取当前时间(现在)并获得警报时间(alarm_time)。你需要考虑设置时也是如此,因为如果用户设置alarm_time = 06:00AM,现在是12:46 PM,则需要为警报添加一天。