2011-11-14 70 views
10

在我的应用程序中,我已经注册了一个广播接收器来接收系统意图ACTION_DEVICE_STORAGE_LOW。我希望只要手机内存不足,就会播放此内容。所以,我下载了一些额外的应用程序(我的手机有一个非常小的内存),导致操作系统显示系统内存不足的通知。电话剩余10-15MB。但是,我的广播接收机从未收到过这个意图。然而,系统通知留在通知栏中,并且由于内存较低,我无法浏览互联网。何时广播ACTION_DEVICE_STORAGE_LOW意图?

只要显示低内存通知,是否应该广播这个意图?还是有一些甚至更低的内存阈值,会发出这种广播,我还没有打到我的手机?在文档中它只说“广播动作:一种粘滞的广播,表明设备上的内存不足”。由于它实际上并没有定义“低内存条件”,我不知道我是否做错了什么,或者如果我还没有达到那种条件。

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

请在这里发布您的代码 –

+0

我刚刚发布我的代码。 DallaRosa的回答非常好,我认为他的广播是以剩余10%的内部存储空间发送的,但我仍然无法接收广播。 – mattgmg1990

+2

如果有人感兴趣,我找到了接收广播的问题的答案。事实证明,这个意图匹配默认的datascheme(意思是不要添加任何数据方案到意图过滤器)。然后它与没有问题的操作相匹配。我创建了两个过滤器来匹配我计划收到的三个操作,因为ACTION_MEDIA_MOUNTED需要添加文件datascheme。 – mattgmg1990

回答

20

TL ; DR

只要设备制造商不更改默认设置,意图将播放时,免费m emory达到内部设备内存的10%。

龙版

我通过了该意图的Android源代码grepped,我到了一个叫DeviceStorageMonitorService类

(位于:框架/基/服务/ JAVA/COM /android/server/DeviceStorageMonitorService.java

根据JavaDoc:

此类实现一个服务来监视设备上的磁盘
的存储空间量。如果在设备的空闲存储小于
比可调阈值(一个安全设置参数;默认 10%)显示在低存储器通知来提醒用户。如果 用户点击低内存通知应用程序 管理器应用程序被启动,让用户免费存储空间 。

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

检查出源代码多一点,该DeviceStorageMonitor发出一个粘广播:(线354)

mContext.sendStickyBroadcast(mStorageLowIntent); 

这意味着,广播结束后也可以通过注册接收机捕捉数据就此而言。

Android Developer - Context

执行sendBroadcast(意向),也就是“粘”在播出后周围意味着意图 您发送入住完成后,使 其他人可以快速检索通过数据返回值为 registerReceiver(BroadcastReceiver,IntentFilter)。在其他所有方面, 的行为与sendBroadcast(意图)相同。

希望这有助于。

+1

非常感谢!我已经接受了你的答案,因为你绝对回答了我问的问题。当电话有10%的可用内部存储空间时,您的通知/广播肯定是正确的。我已经证实了这一点。但是,我仍然不确定为什么我的申请没有按预期收到意图。我会尽量利用这个事实,即广播是粘性的,通过定期检查你所提到的值,但我也希望在发生广播时收到广播,以便我可以向用户显示我自己的通知。 – mattgmg1990