2011-11-14 31 views
10

Trong ứng dụng của tôi, tôi đã đăng ký bộ thu phát sóng để nhận ý định hệ thống ACTION_DEVICE_STORAGE_LOW. Tôi đã mong đợi điều này được phát sóng bất cứ khi nào điện thoại có bộ nhớ trong thấp. Vì vậy, tôi đã tải xuống một vài ứng dụng bổ sung (điện thoại của tôi có bộ nhớ trong rất nhỏ) khiến hệ điều hành hiển thị thông báo rằng bộ nhớ hệ thống thấp. Điện thoại còn lại 10 - 15 MB. Tuy nhiên, người nhận phát sóng của tôi chưa bao giờ nhận được ý định đó. Tuy nhiên, thông báo hệ thống vẫn nằm trong thanh thông báo và tôi không thể duyệt internet do bộ nhớ trong thấp.Mục đích ACTION_DEVICE_STORAGE_LOW được phát khi nào?

Mục đích này có được phát sóng bất cứ khi nào thông báo bộ nhớ trong thấp được hiển thị không? Hoặc là có một số thậm chí thấp hơn ngưỡng bộ nhớ mà sẽ gửi phát sóng này mà tôi đã không nhấn chưa trên điện thoại của tôi? Trong tài liệu, nó chỉ nói "Broadcast Action: Một phát sóng dính chỉ ra tình trạng bộ nhớ thấp trên thiết bị." Vì nó không thực sự xác định "tình trạng bộ nhớ thấp", tôi không biết nếu tôi làm điều gì đó sai, hoặc nếu tôi chỉ đơn giản là chưa đạt được điều kiện đó.

Đây là mã cho BroadCastReceiver tôi:

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); 
     } 
    } 
} 

Tôi đã một dịch vụ mà khởi đầu thu, bổ sung thêm các bộ lọc ý định và đăng ký nó (trong số những thứ khác):

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

vui lòng đăng mã của bạn tại đây –

+0

Tôi vừa đăng mã của mình. Câu trả lời của DallaRosa rất tuyệt và tôi nghĩ anh ấy đúng về việc phát sóng được gửi ở mức 10% dung lượng lưu trữ nội bộ còn lại, nhưng tôi vẫn chưa thể nhận được chương trình phát sóng. – mattgmg1990

+2

Trong trường hợp ai đó quan tâm, tôi đã tìm thấy câu trả lời cho vấn đề của tôi khi phát sóng. Nó chỉ ra rằng ý định này phù hợp với dữ liệu mặc định (có nghĩa là không thêm bất kỳ lược đồ dữ liệu nào vào bộ lọc ý định). Sau đó, nó phù hợp với hành động mà không có một vấn đề. Tôi đã tạo hai bộ lọc để khớp với ba hành động mà tôi đã lên kế hoạch nhận vì ACTION_MEDIA_MOUNTED cần thêm tệp dữ liệu. – mattgmg1990

Trả lời

20

TL ; DR

Miễn là trình tạo thiết bị không thay đổi cài đặt mặc định, mục đích sẽ được phát khi m miễn phí emory đạt 10% bộ nhớ trong của thiết bị.

dài Version

tôi grepped thông qua mã nguồn Android cho ý định đó và tôi đã đến một lớp được gọi là DeviceStorageMonitorService

(nằm tại địa chỉ: khung/cơ sở/dịch vụ/java/com /android/server/DeviceStorageMonitorService.java)

Từ javadoc:

Lớp học này triển khai dịch vụ theo dõi dung lượng đĩa
dung lượng lưu trữ trên thiết bị. Nếu dung lượng miễn phí trên thiết bị ít hơn
so với giá trị ngưỡng có thể điều chỉnh (thông số cài đặt bảo mật; mặc định 10%), thông báo bộ nhớ thấp được hiển thị để cảnh báo người dùng. Nếu người dùng nhấp vào thông báo bộ nhớ thấp, ứng dụng Trình quản lý sẽ được khởi chạy để cho phép người dùng lưu trữ miễn phí không gian.

Vì vậy, bạn đã có nó. Miễn là nhà sản xuất thiết bị không thay đổi điều đó, nó sẽ ở mức 10%.

Kiểm tra ra mã nguồn hơn một chút, các DeviceStorageMonitor gửi ra một Broadcast dính: (dòng 354)

mContext.sendStickyBroadcast(mStorageLowIntent); 

Có nghĩa là ngay cả sau khi phát sóng xong bạn có thể bắt các dữ liệu bằng cách đăng ký một máy thu về ý định đó.

từ Android Developer - Context:

Thực hiện một sendBroadcast (Ý định) đó là "dính", nghĩa là ở lại Ý định bạn đang gửi xung quanh sau khi phát sóng xong, để người khác có thể nhanh chóng lấy lại dữ liệu thông qua giá trị trả lại của registerReceiver (BroadcastReceiver, IntentFilter). Trong tất cả các cách khác, hoạt động này giống như sendBroadcast (Intent).

hy vọng điều này sẽ hữu ích.

+1

Cảm ơn rất nhiều! Tôi đã chấp nhận câu trả lời của bạn vì bạn đã hoàn toàn trả lời câu hỏi tôi đã hỏi. Bạn chắc chắn đúng về thông báo/phát sóng đang được gửi khi điện thoại có bộ nhớ trong có sẵn 10%. Tôi đã xác minh điều đó. Tuy nhiên, tôi vẫn không chắc tại sao đơn đăng ký của tôi không nhận được ý định như mong đợi. Tôi sẽ cố gắng sử dụng thực tế rằng chương trình phát sóng được dán bằng cách kiểm tra định kỳ giá trị như bạn đã đề cập, nhưng tôi cũng muốn nhận được chương trình phát sóng khi nó xảy ra để tôi có thể trình bày thông báo của riêng mình cho người dùng. – mattgmg1990

Các vấn đề liên quan