2011-11-14 50 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