2011-06-28 16 views
7

मैं अपनी गतिविधि के भीतर इरादे Intent.ACTION_BATTERY_CHANGED के लिए सुनने में सक्षम हूं और यह बहुत अच्छा काम करता है। मैं प्रकट में रिसीवर को परिभाषित करने की कोशिश की:एंड्रॉइड ब्रॉडकास्ट रिसीवर android.intent.action.BATTERY_CHANGED

<receiver android:name="com.beargreaves.battery.BatteryReceiver"> 
    <intent-filter> 
     <action android:name="android.intent.action.BATTERY_CHANGED" /> 
    </intent-filter> 
</receiver> 

लेकिन यह काम नहीं किया, मैं यहाँ कह रही है कि यह प्रोग्राम के रूप में परिभाषित किया जाना चाहिए पर एक पोस्ट पढ़ें। मेरी गतिविधि में रिसीवर के लिए पंजीकरण करने की बजाय, मैं इसे एक सेवा में प्राप्त करना चाहता था ताकि वह लगातार निगरानी रख सके। मैंने इसे सफलतापूर्वक हासिल कर लिया है, और यह काम करता है, लेकिन मैं यह देखने के लिए अपने काम को देखना चाहता था कि यह सही दृष्टिकोण है या नहीं।

मैं विस्तार BroadcastReceiver द्वारा शुरू किया:

public class BatteryReceiver extends BroadcastReceiver{ 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Bundle bundle = intent.getExtras(); 

     if(null == bundle) 
      return; 

     boolean isPresent = intent.getBooleanExtra("present", false); 
     String technology = intent.getStringExtra("technology"); 
     int plugged = intent.getIntExtra("plugged", -1); 
     int scale = intent.getIntExtra("scale", -1); 
     int health = intent.getIntExtra("health", 0); 
     int status = intent.getIntExtra("status", 0); 
     int rawlevel = intent.getIntExtra("level", -1); 
     int level = 0; 

     Log.d("Debug","Battery Receiver OnReceive"); 

     if(isPresent) { 
      if (rawlevel >= 0 && scale > 0) { 
       level = (rawlevel * 100)/scale; 

       Log.d("Debug","BatterReceiver: " + level); 

       Toast.makeText(context,"Battery Receiver: " + level + "\t" + status + "Raw: " + rawlevel,Toast.LENGTH_LONG).show(); 

       if(level <60) { 
        /* 
        * Only invoke the service when level below threshold 
        */ 
        Intent i = new Intent(context, BatteryService.class); 
        i.putExtra("level", level); 
        context.startService(i); 
       } 
      } 
     } 
    } 
} 

और फिर मैं एक सेवा का उपयोग पहले onCreate() में रिसीवर रजिस्टर और फिर onStart() में घटनाओं को संभालने के लिए। यदि मेरा स्तर सीमा से नीचे है तो मेरा ब्रॉडकास्ट रिसीवर सेवा शुरू करता है।

public class BatteryService extends Service { 
    /* 
    * First Call to onStart we don't want to do anything 
    */ 
    boolean avoidFirst = false; 
    private BroadcastReceiver receiver; 

    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 
     receiver = new BatteryReceiver(); 
     registerReceiver(receiver, filter); 
    } 

    @Override 
    public void onStart(Intent intent, int startId) { 
     Log.d("Debug","Battery Service On Start"); 
     int level = intent.getIntExtra("level", -1); 

     if(avoidFirst) { 
      if(level != -1) { 
       Log.d("Debug","Battery Alert Notifying..... " + level); 
       SMSManager.sendSMS(BatteryService.this, "<number redacted>", "Battery Level Aleart: " + level); 
       stopSelf(); 
      } 
     } else { 
      avoidFirst = true; 
     } 
    } 

    @Override 
    public void onDestroy() { 
     // TODO Auto-generated method stub 
     super.onDestroy(); 
     PreferenceUtil.updatePreference(BatteryService.this, "battery_monitor_on", false); 
     unregisterReceiver(receiver); 
    } 
} 

क्या यह सही दृष्टिकोण है? हो सकता है कि रिसीवर को onCreate() में पंजीकृत करें और फिर कोई ईवेंट प्राप्त होने पर सेवा शुरू करें। सबसे पहले मैंने सेवा का उपयोग नहीं करने की कोशिश की लेकिन फिर मेरे पास रिसीवर को पंजीकृत करने का कोई तरीका नहीं है क्योंकि इसे मैनिफेस्ट में हासिल नहीं किया जा सकता है। दूसरी बार जब मैंने onReceive() में एक टेक्स्ट संदेश भेजने की कोशिश की तो एक अपवाद फेंक दिया गया। मैंने पढ़ा है कि onReceive() किसी भी धागे को शुरू नहीं करना चाहिए।

अग्रिम धन्यवाद

+0

+1 अपने प्रश्न में मेरा उत्तर देने के लिए: D –

उत्तर

2

हां, यह एक बहुत अच्छा दृष्टिकोण की तरह दिखता है। यह मेरे ऐप के साथ जो कुछ भी करता है, उससे काफी समान है (वास्तव में कुछ बेहतर है, मैं कहूंगा) (जो वर्षों से अच्छी तरह से काम कर रहा है)।

+0

आपके उत्तर के लिए बहुत धन्यवाद। – Bear

+1

@ दर्शन! क्या आप प्रश्न के बजाय अपने उत्तर में अपना उत्तर जोड़ सकते हैं क्योंकि यह अभी काफी उलझन में है। –

+0

@ShajelAfzal मुझे समझ में नहीं आता है। यह मेरा जवाब है। मेरा जवाब यह था कि कुछ गलतफहमी के बाद दृष्टिकोण भालू आया, प्रश्न में प्रस्तुत दृष्टिकोण वास्तव में एक उचित है जो कि मैंने सात वर्षों तक उत्पादन में उपयोग किए गए दृष्टिकोण के समान है। –

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