ACTION_TIME_CHANGED или ACTION_DATE_CHANGED, не может заставить их работать - PullRequest
3 голосов
/ 27 октября 2011

Итак, я пытаюсь заставить несколько людей работать на меня, и у меня проблемы с 2 конкретными намерениями. Я искал эти группы и паутины и не может найти больше информации, чем то, что документация дает мне. Кажется, не имеет значения, заявляю ли я об использовании этих намерений в манифест, или если я пытаюсь зарегистрировать получателя в коде, мой получатель никогда не получает действия для ACTION_TIME_CHANGED или ACTION_DATE_CHANGED. Насколько я могу сказать, я должен получать эти действия в моем приемник вещания всякий раз, когда пользователь явно устанавливает время / дату перейти к "Settings" --> "Date & Time", а затем изменить время или Дата Я неправильно понимаю, для чего эти действия? Есть ли какие-либо разрешения, которые я должен объявить, чтобы получить эти действия? Кто-нибудь работал с этими действиями?

Есть ли полезный пример, где используются эти действия, я не смог найти ничего полезного, есть множество примеров изменения формата, но не по фактическому изменению времени_даты ...

Заранее спасибо

Ответы [ 6 ]

5 голосов
/ 24 февраля 2014

В дополнение к <intent-filter> см. Android ACTION_DATE_CHANGED об ошибке AOSP: ACTION_TIME_CHANGED должен срабатывать, когда часы установлены, и ACTION_DATE_CHANGED должен срабатывать, когда часы переключаются на следующий.день, но если часы будут установлены в обратном направлении, ACTION_DATE_CHANGED не сработает снова, пока часы не догонят то, что должно было быть на следующий день.

2 голосов
/ 01 октября 2013

Intent.ACTION_DATE_CHANGED и Intent.ACTION_TIME_CHANGE D запускаются только тогда, когда пользователь вручную изменяет время или дату, и они не запускаются системой автоматически.

Боюсь, вы должны использовать Intent.ACTION_TIME_TICK, который запускается системой ровно каждую минуту.

1 голос
/ 18 января 2012

Да, вы должны добавить

<intent-filter>
   <action android:name="android.intent.action.DATE_CHANGED"></action>
</intent-filter>
0 голосов
/ 14 февраля 2018

Вам не нужно никакого разрешения.

Чтобы получать уведомления об изменении даты, вам необходимо зарегистрироваться на BroadcastReceiver с этими действиями (а также ACTION_TIMEZONE_CHANGED).

Вот решение, которое я сделал:

https://stackoverflow.com/a/48782963/878126

0 голосов
/ 14 ноября 2017

Альтернативный подход, который я использовал для выполнения действия при изменении даты.

На самом деле Intent.ACTION_DATE_CHANGED работает только с датой расширенного срока, а не с предыдущей датой, когда вы изменяетедата на телефоне вручную.Кроме того, когда вы устанавливаете время в 11:59 и ждете, пока оно станет 00:00, чтобы дать вам событие трансляции изменения даты, оно не даст вам триггера.

Итак, я закончил тем, что создал свою собственную логику сохранения даты в общем префе, а затем проверил, является ли текущая дата позже или раньше ранее сохраненной даты (с некоторой логикой обработки даты) и обновил мои данные на основе этого,

  private void takesomeActionIfDateIsChanged() {
    try {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);

        long currentDateTimeInMillis = System.currentTimeMillis();
        Date currentDateWithMillis = new Date(currentDateTimeInMillis);

        String formattedCurrentDateWithOnlyDMYStr = dateFormat.format(currentDateWithMillis);
        Log.d(TAG, "formattedCurrentDate With Only DateMonthAndYear String : " + formattedCurrentDateWithOnlyDMYStr);
        Date formattedCurrentDate = dateFormat.parse(formattedCurrentDateWithOnlyDMYStr);

        String storedDateStr = mSpManager.getStoredDate(SPManager.STORED_DATE);
        Log.d(TAG, "storedDateStr : " + storedDateStr);
        Date storedDateOnlyWithDateMonthAndYear = dateFormat.parse(storedDateStr);

        if (formattedCurrentDate.after(storedDateOnlyWithDateMonthAndYear)) {
            Log.d(TAG, "The current date is after stored date");
            mSpManager.putNewDate(SPManager.STORED_DATE, formattedCurrentDateWithOnlyDMYStr);
            mCounter = 0;
        } else if (formattedCurrentDate.before(storedDateOnlyWithDateMonthAndYear)) {
            Log.d(TAG, "The current date is before stored date");
            mSpManager.putNewDate(SPManager.STORED_DATE, formattedCurrentDateWithOnlyDMYStr);
            mCounter = 0;
        } else {
            Log.d(TAG, "The current date is same as stored date");
        }
    } catch (Exception e) {
        Log.e(TAG, "exception : ", e);
    }
}
0 голосов
/ 27 октября 2011

Внутри вашего приемника вещания метод onReceive Я предполагаю, что у вас есть настройки, аналогичные приведенным ниже?

@Override
public void onReceive(Context context, Intent intent){
    final String action = intent.getAction();
    if (Intent.ACTION_DATE_CHANGED.equals(action) || Intent.ACTION_TIME_CHANGED.equals(action)){
    // do stuff here
    }
    ...
}

Другое соображение - вы добавили бы подходящие фильтры в IntentFilter, такие как ...

IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_TIME_CHANGED);
filter.addAction(Intent.ACTION_DATE_CHANGED);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...