android如何接收DEVICE_STORAGE_LOW(存储空间不足)广播 | DEVICE_STORAGE_OK广播慢的原因

前言

当存储空间不足时,android系统会发送一条存储空间不足的广播,同时通知栏会弹出消息,普通应用可以捕获此广播,从而得知系统处于低存储的状态。
但是在实际测试时发现,android.intent.action.DEVICE_STORAGE_LOWandroid.intent.action.DEVICE_STORAGE_OK这两个广播需要等一段时间才能收到,特别是的DEVICE_STORAGE_OK,要等待的时间则更长,大概得有十几秒。



如何监听DEVICE_STORAGE_LOW广播?

方式一:注册静态广播

AndroidManifest.xml文件中增加以下内容

<application
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    ...此处内容省略...
    >
    
	<!-- receiver中的内容是广播相关的 -->
	<receiver
	    android:name=".MyStorageLOW"
	    android:enabled="true"
	    android:exported="true">
	    <intent-filter>
	        <action android:name="android.intent.action.DEVICE_STORAGE_LOW" />
	    </intent-filter>
	</receiver>

</application>

创建新的类,继承BroadcastReceiver

public class MyStorageLOW extends BroadcastReceiver {
    
    

    @Override
    public void onReceive(Context context, Intent intent) {
    
    
        //TODO:收到存储空间不足的广播时,此方法会被调用
        //TODO:此处插入一些操作...
    }
}

方式二:注册动态广播

BroadcastReceiver receiver;

receiver = new BroadcastReceiver() {
    
    
    @Override
    public void onReceive(Context context, Intent intent) {
    
    
        if (Intent.ACTION_DEVICE_STORAGE_LOW.equals(intent.getAction())) {
    
    
            //TODO:收到存储空间不足的广播
        }
    }
};
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_DEVICE_STORAGE_LOW);
registerReceiver(receiver, filter); //记得调用 unregisterReceiver(receiver) 取消注册

说明

虽然android O会提示方法过时,同时方法会标上横线进行警告,但是我在android 11的模拟器上测试是能收到的,所以暂时不用担心此功能失效。
方法过时



如何修改低存储提示的阈值或范围?

android默认的存储空间不足触发条件为:1.低于总存储的5%;2.低于500MB,两个条件选容量最小的那个。例如你的手机有64GB,则触发条件会是500MB,如果你的手机存储只有8GB,则触发条件会是:8GB * 5% ≈ 400MB。如果想修改此限制,可以到frameworks下修改StorageManager

路径:frameworks\base\core\java\android\os\storage\StorageManager.java
...
private static final int DEFAULT_THRESHOLD_PERCENTAGE = 5;  //修改此处的值可调整百分比
private static final long DEFAULT_THRESHOLD_MAX_BYTES = DataUnit.MEBIBYTES.toBytes(500); //修改此处的值可调整大小,单位byte
....

然后搜索变量:DEFAULT_THRESHOLD_PERCENTAGEDEFAULT_THRESHOLD_MAX_BYTES,前者是百分比,后者是固定值,分别对应于前面说的两个触发条件。



广播收到的慢的原因

本人实际测试下来,当达到指定阈值时,存储空间不足的广播很快就发送了过来,但是删除一部分文件后,却等了一会才收到DEVICE_STORAGE_OK的广播。此问题网上帖子很少,我大致总结了一下,可能是以下原因:
android有个存储扫描机制,当你的存储空间出现不足时,会先执行一些操作,例如尝试清理一些文件来缓解此现象,如果上面的这些流程执行过后,依旧空间不足,才会发送广播。同时android会开始扫描当前的存储空间,频率为60s每次,直到设备脱离空间不足的状态
DeviceStorageMonitorService
也就是说假设我们在40秒的时候删除文件,那么系统会在60秒时才扫描一下设备的存储空间,那么对应的DEVICE_STORAGE_OK广播也就会延迟20s才会发送过来了。

不过此问题android开发文档上也没有找到明确的说明,所以此推论只供参考,如果有知道真正原因的可以评价。



参考博客

Android O 版本(Android 8.0) 存储空间不足时提醒

Android Low Storage机制(DeviceStorageMonitorService)

分析DeviceStorageMonitorService

Android Service之设备存储空间监控

搜索 DEFAULT_THRESHOLD_MAX_BYTESDEFAULT_THRESHOLD_PERCENTAGE可查到更多相关内容

猜你喜欢

转载自blog.csdn.net/Guan_li_peng/article/details/127634728