【问题标题】:When is the intent ACTION_DEVICE_STORAGE_LOW broadcasted?何时广播意图 ACTION_DEVICE_STORAGE_LOW?
【发布时间】:2021-07-30 08:09:18
【问题描述】:

在我的应用程序中,我注册了一个广播接收器来接收系统意图 ACTION_DEVICE_STORAGE_LOW。我希望每当手机内存不足时都会播放此消息。因此,我下载了一些额外的应用程序(我的手机内存非常小),导致操作系统显示系统内存不足的通知。手机剩余 10 - 15 MB。但是,我的广播接收器从未收到过这种意图。但是系统通知一直停留在通知栏中,由于内存不足,我无法浏览互联网。

是否应在显示内存不足通知时广播此意图?或者是否有一些更低的内存阈值可以发送我尚未在手机上点击的广播?在文档中,它只显示“广播操作:指示设备内存不足的粘性广播”。由于它实际上并没有定义“低内存条件”,我不知道我是否做错了什么,或者我只是还没有达到那个条件。

这是我的 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();
}

【问题讨论】:

  • 我刚刚发布了我的代码。 DallaRosa 的回答很棒,我认为他是正确的关于以 10% 的内部存储空间发送广播,但我仍然无法接收广播。
  • 如果有人感兴趣,我找到了接收广播问题的答案。事实证明,此意图与默认数据方案匹配(意味着不向意图过滤器添加任何数据方案)。然后它匹配动作没有问题。我创建了两个过滤器来匹配我计划接收的三个操作,因为 ACTION_MEDIA_MOUNTED 需要添加文件数据方案。

标签: android broadcastreceiver


【解决方案1】:

TL;DR

只要设备制造商不更改默认设置,当可用内存达到设备内部内存的 10% 时,就会广播意图。

加长版

我浏览了该意图的 Android 源代码,并找到了一个名为 DeviceStorageMonitorService 的类

(位于:frameworks/base/services/java/com/android/server/DeviceStorageMonitorService.java

来自 javadoc:

这个类实现了一个监控磁盘数量的服务
设备上的存储空间。如果设备上的可用存储空间较少
比可调阈值(安全设置参数;默认 10%) 显示内存不足通知以提醒用户。如果 用户点击应用程序内存不足通知 启动管理器应用程序以让用户释放存储空间 空间。

所以你有它。只要设备制造商不改变这一点,它将保持在 10%。

再检查一下源代码,DeviceStorageMonitor 会发出一个粘性广播:(第 354 行)

mContext.sendStickyBroadcast(mStorageLowIntent);

这意味着即使在广播完成后,您也可以通过在该意图上注册接收器来捕获数据。

来自Android Developer - Context

执行“粘性”的 sendBroadcast(Intent),表示 Intent 您在广播完成后发送停留,以便 其他人可以通过返回值快速检索该数据 registerReceiver(BroadcastReceiver,IntentFilter)。在所有其他方面, 这与 sendBroadcast(Intent) 的行为相同。

希望这会有所帮助。

【讨论】:

  • 非常感谢!我已经接受了你的回答,因为你已经完全回答了我提出的问题。当手机有 10% 的可用内部存储空间时发送通知/广播,您绝对是正确的。我已经证实了这一点。但是,我仍然不确定为什么我的应用程序没有按预期收到意图。我将尝试通过定期检查您提到的值来利用广播的粘性这一事实,但我也希望在广播发生时也收到广播,以便我可以向用户展示我自己的通知。
  • 自从这个答案在近十年前发布并被接受以来,有什么变化吗?
  • @RockPaperLz-MaskitorCasket 实际上他们有!让我稍后再更新我的答案。如果您想查看最新的源代码,请在此处找到:cs.android.com/android/platform/superproject/+/…
  • 感谢您的链接,期待您的更新答复!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多