2013-08-26 5 views
5

मैं एक पुस्तकालय है, जो निम्नलिखित संरचना है निर्माण कर रहा हूँ:मैं कैसे बच करते BroadcastReceiver रिसाव

MySDK{ 
    public static void init(Context context){ 
     registerReceivers(); // Register connectivity BroadcastReceiver here 
    } 

    public static void performAction(){}; 
} 

इरादा उपयोग है: मेरे पुस्तकालय) कॉल init (प्रथम गतिविधि में के उपयोगकर्ताओं वो बनाते हैं। समस्या यह है कि मैं ब्रॉडकास्ट रिसीवर अनधिकृत नहीं करता हूं और ऐप बंद होने पर यह लीक हो जाता है। मैं deinit() नामक एक विधि बना सकता हूं और गतिविधि छोड़कर lib को कॉल करने के लिए कह सकता हूं, लेकिन क्या संसाधनों को मुक्त करने के लिए मेरे पास एक और अधिक विश्वसनीय तरीका है?

क्यों मुझे रिसीवर की आवश्यकता है?

यदि कोई इंटरनेट कनेक्शन नहीं है और निष्पादन() डेटा नहीं भेज सकता है, तो मैं कनेक्टिविटी राज्य परिवर्तन का पता लगाने के लिए रिसीवर पंजीकृत करता हूं।

+0

ब्रॉडकास्ट रिसीवर केवल पहली गतिविधि में आवश्यक होगा या क्या उन्हें अधिक समय की आवश्यकता होगी? – Simon

+0

@ सिमॉन अपडेट देखें। मुझे हर समय रिसीवर की आवश्यकता होगी। –

+0

एक ऐसी सेवा बनाएं जो इस रिसीवर को पंजीकृत करे। –

उत्तर

3

आप यह घोषणा करते हैं प्रकट एंड्रॉयड में प्रसारण रिसीवर ख्याल रखेंगे रजिस्टर के संचालन के।

इस

<receiver android:name="class name with package"> 
     <intent-filter> 
      <action android:name=" corresponding broadcast name" /> 
     </intent-filter> 
</receiver> 
+1

पंजीकृत कई रिसीवर रखने की चिंता से बचने के लिए, यह उतना सरल है जितना आप प्राप्त कर सकते हैं। अधिसूचना प्राप्त करने के लिए इसे मैन्युअल रूप से शुरू करने के लिए आवेदन की आवश्यकता नहीं है। –

0

ऑन-रिसीव विधि समाप्त होने के बाद आप रिसीवर को अनधिकृत कर सकते हैं (इसके अंत में)।

लेकिन मुझे नहीं पता कि यह आपके लिए उपयुक्त है, यह आपके रिसीवर क्या करता है इस पर निर्भर करता है।

यह मेरे लिए काम किया जब SMSsent/वितरित रिसीवर दर्ज की ..

2

क्यों न केवल रिसीवर रजिस्टर performAction() कार्रवाई स्थगित करने की जरूरत है? इससे रिसीवर को केवल तभी सीमित किया जा सकता है जब वास्तव में कुछ करने की प्रतीक्षा हो। एक बार रिसीवर सफलतापूर्वक अपनी कतारों की कतार को फ्लश कर देता है, तो यह रिसीवर को स्वयं पंजीकृत कर सकता है।

0

आप android.app.Application विस्तार के बारे में सोचा और इन तरीकों को लागू करता है:

void onCreate() 

void onLowMemory() 

आप सभी BroadcastReceivers आप onCreate अंदर की जरूरत रजिस्टर और onLowMemory अंदर उन्हें अपंजीकृत कर सकते हैं।

इस कक्षा का संदर्भ पुनर्प्राप्त करने के लिए आप context.getAplicationContext() को कॉल कर सकते हैं और इसे अपने एप्लिकेशन उप-वर्ग में डाल सकते हैं।

अंत में, अपने अनुप्रयोग इस समाधान का उपयोग करने के लिए, आप ऐसा अपने AndroidManifest.xml अंदर टैग के अंदर इन जानकारियां डाल करने के लिए है:

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:name="[fully qualified name of your Application subclass]" > 
... 
</application> 
0

तरह आवेदन टैग के अंदर अपने रिसीवर रजिस्टर आप रिसीवर सभी गतिविधियों में आप एक सेवा है जो रिसीवर, here आप एक सेवा बनाने का तरीका देख सकते हैं पंजीकृत करता है बनाना चाहिए की जरूरत है।

रिसीवर को अपंजीकृत करने के लिए आप यह पता लगा सकते हैं कि उपयोगकर्ता ऐप को वर्तमान में अग्रभूमि में पैकेज नाम जानने के लिए कब समाप्त करता है। जब आपको इसकी आवश्यकता नहीं होती है तो आप रिसीवर को अपंजीकृत कर रहे हैं, जब उपयोगकर्ता ऐप से बाहर निकलता है तो यह रिसाव नहीं होगा क्योंकि अब यह सेवा या गतिविधि के लिए सेवा से जुड़ा हुआ है और जुड़ा हुआ है।

public String getForegroundApp() throws NameNotFoundException{ 

     RunningTaskInfo info = null; 
     ActivityManager am; 
     am = (ActivityManager)mContext.getSystemService(ACTIVITY_SERVICE); 
     List<RunningTaskInfo> l = am.getRunningTasks(1000); 
     System.out.println(l); 
     Iterator <RunningTaskInfo> i = l.iterator(); 


     String packName = new String(); 
     String appName = new String(); 
     ApplicationInfo appInfo = new ApplicationInfo(); 

     while(i.hasNext()){ 
      info = i.next(); 
      packName = info.topActivity.getPackageName(); 
      if(!packName.equals("com.htc.launcher") && !packName.equals("com.android.launcher")){ //this could be what is causing the problem. not sure. 
       packName = info.topActivity.getPackageName(); 
       break; 
      } 
      info = i.next(); 
      packName= info.topActivity.getPackageName(); 
      break;   
      } 
     return packName; 
     } 

वैसे भी, मुझे लगता है कि आप एक stop() विधि की तरह कुछ बना सकते हैं और उपयोगकर्ता इसे कहते सब कुछ आप चाहते हैं को अंतिम रूप देने के लिए जब वे जानते हैं कि एपीपी बाहर निकलने कर रहे हैं और पुस्तकालय नहीं अब और आवश्यक है देना चाहिए।

+0

एक सेवा हमेशा सिस्टम द्वारा चलती रहती है। यह इस मामले के लिए एक बड़ा संसाधन हॉग है, जहां सेवा करने के लिए कुछ भी नहीं है लेकिन एक रिसीवर के लिए प्लेसहोल्डर बनें ... –

संबंधित मुद्दे