Когда транслируется намерение ACTION_DEVICE_STORAGE_LOW? - PullRequest
10 голосов
/ 14 ноября 2011

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

Следует ли передавать это намерение всякий раз, когда отображается уведомление о нехватке внутренней памяти?Или есть какой-то еще более низкий порог памяти, который будет отправлять эту трансляцию, которую я еще не включил в свой телефон?В документации говорится только «Действие широковещательной рассылки: липкая широковещательная рассылка, которая указывает на нехватку памяти на устройстве».Поскольку он фактически не определяет «состояние нехватки памяти», я не знаю, делаю ли я что-то неправильно или просто еще не выполнил это условие.

Вот код для моего 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 Ответ

23 голосов
/ 14 ноября 2011

TL; DR

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

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

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

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

Из javadoc:

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

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

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

mContext.sendStickyBroadcast(mStorageLowIntent);

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

из Android Developer - Context :

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...