[英]Why BroadcastReceiver is initializing on past time?
我正在制作一個應用程序,該應用程序:
如果時間范圍是將來的話,一切都可以正常工作(在上述情況下,如果我的電話時間在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在過去的時間初始化?
出現這種情況的原因是,Android並未將其調用為確切的時間(除非您設置了一些特殊標志)。 Android這樣做是為了提高電池使用率。 這導致Android嘗試針對給定的屬性集盡快調用該警報偵聽器。 由於時間窗口已到,Android調用它的時間已晚,因此它會盡力而為,幾乎可以直接調用它。
因此,只需檢查窗口是否已過去,如果是,則為第一個呼叫添加一天。 我也在我的應用程序中這樣做,並且效果很好。
您可以通過此簡單的通話添加一天:
if(calendar.before(GregorianCalendar.getInstance())) {
calendar.add(Calendar.DAY_OF_MONTH, 1);
}
之所以發生這種情況,是因為您已經設置了時間警報,該時間已經過去。 因此,Android會在當前時間初始化廣播接收器。 您需要檢入代碼...如果時間已經過去,請設置第二天的時間。
設置警報前先檢查一下:
if(alarm_time_in_ms < System.getCurrentTimeMillis())
{
calendar.add(Calendar.DAY_OF_MONTH, 1);
}
希望能幫助到你!
它似乎正在做的是獲取當前時間並為此設置警報。我認為您需要做的是獲取當前時間(現在)並獲取警報時間(alarm_time)。您還需要考慮幾天之所以進行設置,是因為如果用戶設置了alarm_time = 06:00AM,現在是12:46 PM,則需要為警報添加一天。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.