When is the intent ACTION_DEVICE_STORAGE_LOW broadcasted?

限于喜欢 提交于 2019-11-30 06:38:24

问题


In my application, I have registered a broadcast receiver to receive the system intent ACTION_DEVICE_STORAGE_LOW. I was expecting this to be broadcasted whenever the phone had low internal memory. So, I downloaded a few extra apps (my phone has a very small internal memory) which caused the OS to display the notification that the system memory is low. The phone had 10 - 15 MB remaining. However, my broadcast receiver never received that intent. Yet, the system notification stays in the notification bar, and I am not able to browse the internet because of low internal memory.

Should this intent be broadcasted whenever the low internal memory notification is displayed? Or is there some even lower threshold of memory that will send out this broadcast that I haven't hit yet on my phone? In the documentation it only says "Broadcast Action: A sticky broadcast that indicates low memory condition on the device." Since it doesn't actually define "low memory condition," I don't know if I am doing something wrong, or if I simply haven't hit that condition yet.

Here is the code for my 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);
        }
    }
}

I have a service that initializes the receiver, adds the intent filter and registers it (among other things):

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

As long as the device maker doesn't change the default settings, the intent will be broadcast when the free memory reaches 10% of the internal device memory.

Long Version

I grepped through the Android source code for that intent and I got to a class called DeviceStorageMonitorService

(located at: frameworks/base/services/java/com/android/server/DeviceStorageMonitorService.java)

From the javadoc:

This class implements a service to monitor the amount of disk
storage space on the device. If the free storage on device is less
than a tunable threshold value (a secure settings parameter; default 10%) a low memory notification is displayed to alert the user. If the user clicks on the low memory notification the Application Manager application gets launched to let the user free storage space.

So there you have it. As long as the device maker doesn't change that, it will be at 10%.

Checking out the source code a bit more, the DeviceStorageMonitor sends out a sticky Broadcast: (line 354)

mContext.sendStickyBroadcast(mStorageLowIntent);

Which means that even after the broadcast is finished you can catch the data by registering a receiver on that intent.

from Android Developer - Context :

Perform a sendBroadcast(Intent) that is "sticky," meaning the Intent you are sending stays around after the broadcast is complete, so that others can quickly retrieve that data through the return value of registerReceiver(BroadcastReceiver, IntentFilter). In all other ways, this behaves the same as sendBroadcast(Intent).

hope this helps.



来源:https://stackoverflow.com/questions/8117881/when-is-the-intent-action-device-storage-low-broadcasted

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!