मैं अपनी गतिविधि के भीतर इरादे 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()
किसी भी धागे को शुरू नहीं करना चाहिए।
अग्रिम धन्यवाद
+1 अपने प्रश्न में मेरा उत्तर देने के लिए: D –