前言
当存储空间不足时,android系统会发送一条存储空间不足的广播,同时通知栏会弹出消息,普通应用可以捕获此广播,从而得知系统处于低存储的状态。
但是在实际测试时发现,android.intent.action.DEVICE_STORAGE_LOW
和android.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_PERCENTAGE
和DEFAULT_THRESHOLD_MAX_BYTES
,前者是百分比,后者是固定值,分别对应于前面说的两个触发条件。
广播收到的慢的原因
本人实际测试下来,当达到指定阈值时,存储空间不足的广播很快就发送了过来,但是删除一部分文件后,却等了一会才收到DEVICE_STORAGE_OK
的广播。此问题网上帖子很少,我大致总结了一下,可能是以下原因:
android有个存储扫描机制,当你的存储空间出现不足时,会先执行一些操作,例如尝试清理一些文件来缓解此现象,如果上面的这些流程执行过后,依旧空间不足,才会发送广播。同时android会开始扫描当前的存储空间,频率为60s每次,直到设备脱离空间不足的状态。
也就是说假设我们在40秒的时候删除文件,那么系统会在60秒时才扫描一下设备的存储空间,那么对应的DEVICE_STORAGE_OK
广播也就会延迟20s才会发送过来了。
不过此问题android开发文档上也没有找到明确的说明,所以此推论只供参考,如果有知道真正原因的可以评价。
参考博客
Android O 版本(Android 8.0) 存储空间不足时提醒
Android Low Storage机制(DeviceStorageMonitorService)
搜索 DEFAULT_THRESHOLD_MAX_BYTES
、DEFAULT_THRESHOLD_PERCENTAGE
可查到更多相关内容