Когда транслируется намерение ACTION_DEVICE_STORAGE_LOW?

В моем приложении я зарегистрировал широковещательный приемник для получения системного намерения ACTION_DEVICE_STORAGE_LOW. Я ожидал, что это будет транслироваться всякий раз, когда у телефона низкая внутренняя память. Итак, я загрузил несколько дополнительных приложений (у моего телефона очень маленькая внутренняя память), что заставило ОС отображать уведомление о низкой системной памяти. В телефоне осталось 10 - 15 МБ. Однако мой вещательный приемник так и не получил этого намерения. Тем не менее, системное уведомление остается в панели уведомлений, и я не могу просматривать Интернет из-за низкой внутренней памяти.

Если это намерение будет транслироваться всякий раз, когда отображается уведомление о низкой внутренней памяти? Или есть какой-то еще более низкий порог памяти, который отправит эту трансляцию, которую я еще не ударил по моему телефону? В документации в нем говорится только "Broadcast Action: липкая трансляция, которая указывает на низкое состояние памяти на устройстве". Поскольку на самом деле он не определяет "низкое состояние памяти", я не знаю, выполняю ли я что-то неправильно, или если я еще не ударил это условие.

Вот код моего BroadCastReceiver:

public class MemoryBroadcastReceiver extends BroadcastReceiver {

    public void onReceive(Context context, Intent intent) {

        String action = intent.getAction();

        if (action.equals(Intent.ACTION_MEDIA_MOUNTED)) {
            Log.isExternalStorageProblem = false;
            Log.clearNotification(Log.externalMemoryNotificationID);
        }

        if (action.equals(Intent.ACTION_DEVICE_STORAGE_OK)) {
            Log.isInternalStorageLow = false;
            Log.clearNotification(Log.internalMemoryNotificationID);
        }

        if (action.equals(Intent.ACTION_DEVICE_STORAGE_LOW)) {
            Log.isInternalStorageLow = true;
            Log.displayMemoryNotification("Internal Storage Low",
                    "The internal storage is low, Please fix this.",
                    "Please clear cache and/or uninstall apps.", Log.internalMemoryNotificationID);
        }
    }
}

У меня есть служба, которая инициализирует приемник, добавляет фильтр намерений и регистрирует его (среди прочего):

private MemoryBroadcastReceiver memoryBroadcastReciever = new MemoryBroadcastReceiver();

public void registerBroadcastReceiver() {
    IntentFilter filter = new IntentFilter();
    filter.addAction(Intent.ACTION_DEVICE_STORAGE_OK);
    filter.addAction(Intent.ACTION_MEDIA_MOUNTED);
    filter.addAction(Intent.ACTION_DEVICE_STORAGE_LOW);
    filter.addDataScheme("file");

    this.getApplicationContext().registerReceiver(memoryBroadcastReciever, filter);
}

    @Override
    public void onCreate() {
        registerBroadcastReceiver();
}

Ответ 1

TL; DR

Пока производитель устройства не изменяет настройки по умолчанию, намерение будет транслироваться, когда свободная память достигает 10% внутренней памяти устройства.

Длинная версия

Я решил использовать исходный код Android для этого намерения, и я попал в класс DeviceStorageMonitorService

(находится по адресу: frameworks/base/services/java/com/android/server/DeviceStorageMonitorService.java)

Из javadoc:

Этот класс реализует службу мониторинга количества дисков
место на устройстве. Если бесплатное хранение на устройстве меньше чем настраиваемое пороговое значение (параметр безопасных настроек, по умолчанию 10%) отображается предупреждение о низкой памяти для предупреждения пользователя. Если пользователь нажимает на уведомление с низкой памятью Приложение Приложение-менеджер запускается, чтобы позволить пользователю свободное хранилище пространство.

Итак, у вас это есть. Пока производитель устройства не изменит его, он будет равен 10%.

Узнать исходный код немного больше, DeviceStorageMonitor отправляет липкую трансляцию: (строка 354)

mContext.sendStickyBroadcast(mStorageLowIntent);

Это означает, что даже после завершения трансляции вы можете поймать данные, зарегистрировав получателя на этом намерении.

из Разработчик Android - Контекст:

Выполните команду sendBroadcast (Intent), которая является "липкой", что означает "Намерение" вы отправляете остатки после завершения трансляции, так что другие могут быстро получить эти данные через возвращаемое значение registerReceiver (BroadcastReceiver, IntentFilter). Другими словами, это ведет себя так же, как sendBroadcast (Intent).

надеюсь, что это поможет.