0

我在做其中的應用程序:爲什麼BroadcastReceiver在過去的時間正在初始化?

  1. 從輸入用戶的時間範圍......(初始時間最終時間)假設用戶給出(18:00至07:00 PM)
  2. 當電話的當前時間等於初始時間然後手機的靜音模式激活。

一切工作正常,如果時間範圍爲未來的(如果我的手機時間是以前05:00 PM在上述情況下):

  1. 比方說我的手機目前的電話時間08: 00 PM我的時間範圍從(06:00 PM至07:00 PM)。然後,在當前時間(08: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方法,TA KES該ArrayList和調用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(); 
} 

未決的意圖

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); 
    } 
} 

現在請大家幫忙解決我的問題...爲什麼廣播接收器是在過去的時間初始化?

回答

1

此行爲的原因是,Android不會將其稱爲確切時間(除非您設置了一些特殊標誌)。 Android正在改善電池使用情況。這導致Android試圖儘可能快地爲給定的一組屬性調用這個警報監聽器。由於您的時間窗口已到,Android很晚才能調用它,所以它最好,並幾乎直接調用它。

所以,只要檢查窗口是否過去,如果是這樣的話,爲第一次調用添加一天。我也在我的應用程序中這樣做,並且它工作正常。

您可以添加一個一天,這個簡單的調用:

if(calendar.before(GregorianCalendar.getInstance())) { 
    calendar.add(Calendar.DAY_OF_MONTH, 1); 
} 
+0

感謝您的回覆......這是不工作...我將它轉換成代碼 –

+0

實際上它是DATE1對此我setRepeating ...它的時間必須由有一天會增加,對吧? –

+0

我已經在startAlarmAt()方法中添加了這段代碼..但是仍然不能工作? –

1

這是發生因爲你的時間,這已經通過設置報警。所以android在當前時間初始化廣播接收器。您需要檢入代碼...如果時間已過,請將其設置爲第二天。

將這個檢查之前設置報警:

if(alarm_time_in_ms < System.getCurrentTimeMillis()) 
{ 
    calendar.add(Calendar.DAY_OF_MONTH, 1); 
} 

希望它能幫助!

+0

我應該將它添加到broadcastReceiver嗎?或在服務? –

+0

在服務之前,在setRepeating()方法之前。 – NightFury

1

它似乎在做的是獲取當前時間併爲此設置鬧鐘。我認爲您需要做的是獲取當前時間(現在)並獲取鬧鐘時間(鬧鐘時間)。您需要在設置時還要考慮日子,因爲如果用戶設置了alarm_time = 06:00AM,現在是12:46 PM,則需要在鬧鐘中添加一天。

相關問題