2011-11-14 6 views
10

अपने आवेदन में, मैं एक प्रसारण रिसीवर प्रणाली आशय ACTION_DEVICE_STORAGE_LOW प्राप्त करने के लिए पंजीकृत किया है। जब भी फोन में आंतरिक आंतरिक मेमोरी थी, तो मैं इसे प्रसारित करने की उम्मीद कर रहा था। इसलिए, मैंने कुछ अतिरिक्त ऐप्स डाउनलोड किए हैं (मेरे फोन में बहुत छोटी आंतरिक मेमोरी है) जिससे ओएस अधिसूचना प्रदर्शित करता है कि सिस्टम मेमोरी कम है। फोन में 10 - 15 एमबी शेष था। हालांकि, मेरे प्रसारण रिसीवर को कभी इरादा नहीं मिला। फिर भी, सिस्टम अधिसूचना अधिसूचना बार में रहती है, और मैं कम आंतरिक स्मृति की वजह से इंटरनेट ब्राउज़ करने में सक्षम नहीं हूं।इरादा ACTION_DEVICE_STORAGE_LOW कब प्रसारित किया गया है?

जब भी निम्न आंतरिक मेमोरी अधिसूचना प्रदर्शित होती है तो क्या इस इरादे को प्रसारित किया जाना चाहिए? या क्या स्मृति की कुछ भी कम सीमा है जो इस प्रसारण को भेज देगी कि मैंने अभी तक अपने फोन पर नहीं मारा है? प्रलेखन में यह केवल "प्रसारण कार्य: एक चिपचिपा प्रसारण है जो डिवाइस पर कम स्मृति स्थिति इंगित करता है।" चूंकि यह वास्तव में "कम स्मृति की स्थिति" को परिभाषित नहीं करता है, इसलिए मुझे नहीं पता कि मैं कुछ गलत कर रहा हूं, या अगर मैंने अभी तक उस स्थिति को नहीं मारा है।

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

मैं एक सेवा है जो रिसीवर initializes, है लक्ष्य फ़िल्टर कहते हैं और (अन्य बातों के अलावा) यह पंजीकृत करता है:

यहाँ मेरी BroadCastReceiver के लिए कोड है

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

मैंने अभी अपना कोड पोस्ट किया है। डल्लारोसा का जवाब बहुत अच्छा है और मुझे लगता है कि वह प्रसारण के बारे में सही है जो 10% आंतरिक भंडारण शेष पर भेजा जा रहा है, लेकिन मैं अभी भी प्रसारण प्राप्त करने में सक्षम नहीं हूं। – mattgmg1990

+2

यदि कोई दिलचस्पी लेता है, तो मुझे प्रसारण प्राप्त करने में मेरी समस्या का उत्तर मिला। यह पता चला है कि यह इरादा डिफ़ॉल्ट डेटाशेम से मेल खाता है (जिसका अर्थ है इरादे फ़िल्टर में कोई डेटा स्कीम नहीं जोड़ना)। फिर यह किसी समस्या के बिना कार्रवाई से मेल खाता है। मैंने उन तीन कार्यों से मेल खाने के लिए दो फ़िल्टर बनाए जिन्हें मैं प्राप्त करने की योजना बना रहा था क्योंकि ACTION_MEDIA_MOUNTED को फ़ाइल डेटाशेम जोड़ा गया है। – mattgmg1990

उत्तर

20

टीएल ; डीआर

जब तक डिवाइस निर्माता डिफ़ॉल्ट सेटिंग्स नहीं बदलता है, तब तक इरादा प्रसारित किया जाएगा जब मुफ़्त एम एमोरी आंतरिक डिवाइस मेमोरी का 10% तक पहुंचता है।

लांग संस्करण

मुझे लगता है कि इरादे के लिए Android स्रोत कोड के माध्यम से grepped और मैं एक वर्ग DeviceStorageMonitorService बुलाया गया

(यहां उपलब्ध हैं: चौखटे/आधार/सेवाओं/जावा/कॉम /android/server/DeviceStorageMonitorService.java)

जावाडोक से:

यह कक्षा डिवाइस पर
संग्रहण स्थान की मात्रा की निगरानी करने के लिए एक सेवा लागू करती है। यदि डिवाइस पर मुफ्त संग्रहण कम से कम
ट्यूनेबल थ्रेसहोल्ड मान (एक सुरक्षित सेटिंग्स पैरामीटर; डिफ़ॉल्ट 10%) से कम है, तो उपयोगकर्ता को चेतावनी देने के लिए कम स्मृति अधिसूचना प्रदर्शित की जाती है। यदि उपयोगकर्ता कम स्मृति अधिसूचना पर क्लिक करता है तो एप्लिकेशन उपयोगकर्ता एप्लिकेशन को निःशुल्क संग्रहण स्थान देने के लिए प्रबंधक एप्लिकेशन लॉन्च किया जाता है।

तो आपके पास यह है। जब तक डिवाइस निर्माता इसे नहीं बदलता है, यह 10% पर होगा। (लाइन 354)

mContext.sendStickyBroadcast(mStorageLowIntent); 

उसके बाद भी प्रसारण समाप्त हो गया है आप एक रिसीवर पंजीकरण से डेटा पकड़ कर सकते हैं इसका मतलब है:

स्रोत कोड की जांच कर रहा थोड़ा अधिक, DeviceStorageMonitor एक चिपचिपा प्रसारण भेजता है उस इरादे पर।

Android Developer - Context से

:

एक sendBroadcast (आशय) वह यह है कि प्रदर्शन करना "रोचक" प्रसारण के बाद चारों ओर आशय आप भेज रहे हैं रहता है जिसका अर्थ पूरा हो गया है, ताकि दूसरों जल्दी से के माध्यम से है कि डेटा पुनः प्राप्त कर सकते हैं रजिस्टर रिसीवर का रिटर्न वैल्यू (ब्रॉडकास्ट रिसीवर, इंटेंटफिल्टर)। अन्य सभी तरीकों से, यह sendBroadcast (इरादा) के समान व्यवहार करता है।

उम्मीद है कि इससे मदद मिलती है।

+1

बहुत बहुत धन्यवाद! मैंने आपका जवाब स्वीकार कर लिया है क्योंकि आपने मुझसे पूछे गए प्रश्न का बिल्कुल जवाब दिया है। फ़ोन पर 10% उपलब्ध आंतरिक संग्रहण होने पर आप अधिसूचना/प्रसारण के बारे में निश्चित रूप से सही हैं। मैंने यह सत्यापित कर लिया है। हालांकि, मुझे अभी भी यकीन नहीं है कि मेरे आवेदन को अपेक्षित उद्देश्य क्यों नहीं मिलता है। मैं इस तथ्य का उपयोग करने की कोशिश करूंगा कि प्रसारण समय-समय पर आपके द्वारा उल्लिखित मूल्य की जांच करके चिपचिपा है, लेकिन जब ऐसा होता है तो प्रसारण भी प्राप्त करना अच्छा लगेगा, इसलिए मैं उपयोगकर्ता को अपनी सूचना दे सकता हूं। – mattgmg1990