簡體   English   中英

為什么BroadcastReceiver在過去的時間初始化?

[英]Why BroadcastReceiver is initializing on past time?

我正在制作一個應用程序,該應用程序:

  1. 用戶輸入的時間范圍...( 初始時間最終時間 )假設用戶給出(06:00 PM至07:00 PM)
  2. 當電話的當前時間等於初始時間時,電話的靜音模式將激活。

如果時間范圍是將來的話,一切都可以正常工作(在上述情況下,如果我的電話時間在05:00 PM之前):

  1. 可以說“我的電話”當前電話時間是08:00 PM ,我的時間范圍是(06:00 PM到07:00 PM) 然后,手機的靜音模式會在我當前的時間(晚上08:00)激活。 它應該在第二天激活...

我為此服務...

每當用戶輸入時間范圍時,它都會啟動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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM