2011-10-02 16 views
12

जैसे ACTION_BATTERY_CHANGED फायरिंग ठीक है, इसलिए मैं एक ऐपविड्ज पर काम कर रहा हूं जो बैटरी स्तर की जांच करता है और इसे टेक्स्ट व्यू पर प्रदर्शित करता है। मेरे कोड इस तरह दिखता है:पागल

public class BattWidget extends AppWidgetProvider { 

private RemoteViews views = new RemoteViews("com.nickavv.cleanwidgets", R.layout.battlayout); 

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int appWidgetIds[]) { 
    final int N = appWidgetIds.length; 
    context.getApplicationContext().registerReceiver(this,new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 
    for (int i = 0; i < N; i++) { 
     int appWidgetId = appWidgetIds[i]; 
     appWidgetManager.updateAppWidget(appWidgetId, views); 
    } 
} 

@Override 
public void onReceive(Context context, Intent intent) { 
    super.onReceive(context, intent); 
    Log.d("onReceive", "Received intent " + intent); 
    if (intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED)) { 
     Integer level = intent.getIntExtra("level", -1); 
     views.setTextViewText(R.id.batteryText, level+"%"); 
     AppWidgetManager myAWM = AppWidgetManager.getInstance(context); 
     ComponentName cn = new ComponentName(context, AirWidget.class); 
     onUpdate(context, myAWM, myAWM.getAppWidgetIds(cn)); 
    } 
} 
} 

और मैं चिंतित हो रही क्योंकि जैसे ही मैं अपने होमस्क्रीन पर विजेट ड्रॉप के रूप में यह 100 उन लॉग एक दूसरे कॉल के बारे में बंद फायरिंग शुरू होता है, और कहा कि यह ACTION_BATTERY_CHANGED प्राप्त है। क्या यह केवल प्रत्येक प्रतिशत की कमी के लिए प्रसारण नहीं किया जाना चाहिए? यह वास्तव में मेरे पूरे लॉन्चर को अंतराल के कारण हुआ, मुझे इसे अनइंस्टॉल करना पड़ा। यह सही नहीं हो सकता है।

+0

वास्तव में इसके बारे में कुछ भी नहीं पता है, लेकिन क्या यह बैटरी की निगरानी करने के लिए एक सेवा स्थापित करने और एक पूर्वनिर्धारित अंतराल पर चौड़े समय तक फ़ीड करने के लिए एक सेवा स्थापित करने लायक है? – mAndroid

उत्तर

23

मेरे कोड इस तरह दिखता है:

आप किसी अन्य BroadcastReceiver से एक BroadcastReceiver पंजीकृत नहीं कर सकता और विश्वसनीय परिणाम मिलता है। एंड्रॉइड आपकी प्रक्रिया को समाप्त कर देगा, क्योंकि ऐसा नहीं लगता कि कुछ भी चल रहा है। ACTION_BATTERY_CHANGED को सुनने का एकमात्र तरीका उस रिसीवर को किसी गतिविधि या सेवा से पंजीकृत करना होगा। यह केवल प्रत्येक प्रतिशत की कमी के लिए प्रसारित होना चाहिए

नहीं है?

आप इसे दस्तावेज कहां देखते हैं? AFAIK, ACTION_BATTERY_CHANGED जब भी हार्डवेयर ऐसा लगता है तब प्रसारित किया जाएगा। साथ ही, ध्यान रखें कि अन्य डेटा उस Intent, जैसे तापमान के भीतर बदलता है।

यदि आप इस ऐप विजेट को कार्यान्वित करना चाहते हैं, तो ACTION_BATTERY_CHANGED के लिए पंजीकरण न करें। इसके बजाए:

  • उपयोगकर्ता को SharedPreference (उदा।, एक मिनट, एक बार हर 15 mintues) एक बार
  • उपयोग AlarmManager, आप एक getBroadcast()PendingIntent
  • के माध्यम से कि मतदान अवधि कि BroadcastReceiver में पर नियंत्रित कर सकें, ACTION_BATTERY_CHANGEDके लिए, लेकिन एक null BroadcastReceiver साथ फोन registerReceiver() के रूप में इस वापस आ जाएगी Intent आप पूर्ववर्ती में लिया गया से बाहर निकल गई
  • उपयोग AppWidgetManager बैटरी स्तर के साथ अपने एप्लिकेशन विजेट उदाहरणों अद्यतन करने के लिए: यदि आप पिछले Intent कि उस कार्य के लिए प्रसारित किया गया था (आप अभी भी इस के लिए getApplicationContext() का उपयोग करने की आवश्यकता होगी टिप्पणी) के लिए कदम (ध्यान दें: यदि आप उन सब सेट कर रहे हैं एक ही हो सकता है, आप आईडी से अधिक पुनरावृति की जरूरत नहीं है - updateAppWidget() कि एक पैरामीटर के रूप में एक ComponentName लेता है का उपयोग)

यह कई फायदे हैं:

  1. आप परवाह नहीं है कि कितनी बार ACTION_BATTERY_CHANGED प्रसारित होता है
  2. उपयोगकर्ता इन चेकों करके नियंत्रित करने के लिए आप कितना बैटरी की खपत हो जाता है (नगण्य होना चाहिए, अगर आप एक मिनट या अधिक के लिए मतदान की अवधि रखने के लिए)
  3. आपका प्रक्रिया सुरक्षित रूप से टर्मिली हो सकती है NATed चुनावों के बीच में है, जिससे इसकी संभावना कम हो उन कार्य हत्यारों और अर्द्ध स्थायी रूप से अपने अनुप्रयोग
+2

यह इस बारे में जाने का सबसे अच्छा तरीका नहीं हो सकता है। मैंने बहुत सारे बंद-स्रोत बैटरी विजेट देखे हैं जो परिवर्तन के तुरंत बाद अपनी जानकारी अपडेट करते हैं (बैटस्टैट एक अच्छा उदाहरण है)। मैंने कभी ऐसा नहीं देखा है जो उपयोगकर्ता को अपडेट अंतराल प्रदान करता है। बैटरी स्तर विजेट हमेशा सटीक होना चाहिए। – Nick

+1

@ निक: "यह इस बारे में जाने का सबसे अच्छा तरीका नहीं हो सकता" - आप अपनी राय के हकदार हैं। "मैंने बहुत सारे बंद-स्रोत बैटरी विजेट देखे हैं जो परिवर्तन के तुरंत बाद अपनी जानकारी अपडेट करते हैं" - जो वे हर समय स्मृति में सेवा रखकर रैम का एक गुच्छा बर्बाद कर करते हैं। उपयोगकर्ता सोचते हैं कि जो डेवलपर्स ऐसा करते हैं वे बेवकूफ हैं, क्यों कार्य हत्यारों को इतना लोकप्रिय है और ओएस को ऐसी सेवाओं को सक्रिय रूप से मारना है। – CommonsWare

+0

@ निक: "बैटरी स्तर विजेट हमेशा सटीक होना चाहिए" - क्योंकि बैटरी स्तर विशेष रूप से अक्सर नहीं बदलता है, इसलिए एक मतदान आर्किटेक्चर पर्याप्त सटीक से अधिक हो सकता है, जबकि रैम हिट से बचने और आसपास की सेवा रखने की अंतर्निहित अविश्वसनीयता पुरे समय। – CommonsWare

0

खैर, अपने onUpdate batteryinfo आशय के लिए रिसीवर के रूप में अपने ही वर्ग दर्ज की है ऊपर गड़बड़ के साथ आप पर हमला करेगा कि बना रही है। इस इरादे को तुरंत पहली जानकारी के लिए ट्रिगर किया जाता है। आपका ऑनसीसीव आपके ऑनडेट को फिर से कॉल कर रहा है। हम इसे एक लूप कहते हैं। इसलिए 100 लॉग एक सेकंड ...

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