Etkinliğimde Intent Intent.ACTION_BATTERY_CHANGED
dinleyebiliyorum ve harika çalışıyor. Ben Manifestteki alıcıyı tanımlayan çalıştı:Android YayınıYayıncı 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>
ama işe yaramadı, ben burada programlı tanımlanmalıdır söyleyerek bir yazı okudum. Etkinliğimdeki alıcıya kaydolmak yerine, bunu bir Serviste gerçekleştirmek istedim, böylece sürekli olarak izler. Bunu başarılı bir şekilde başardım ve işe yarıyor ama doğru yaklaşım olup olmadığını görmek için çalışmamı kontrol etmek istedim.
Ben uzanan BroadcastReceiver tarafından başlatılmış: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);
}
}
}
}
}
Sonra ilk onCreate()
alıcıyı kayıt ve ardından onStart()
olayları işlemek için bir Hizmeti kullanmak. Yayınım eşik değerin altındaysa Yayım Kurcum Hizmeti başlatır.
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);
}
}
Bu doğru yaklaşım mı? Bu alıcıyı 'a kaydettirin ve ardından bir olay alındığında Servis'i başlatın. İlk önce bir Hizmet kullanmamayı denedim, ancak daha sonra, bu açıkta elde edilemediğinden alıcıyı kaydetme yolum yok. İkinci olarak, onReceive()
'da bir metin mesajı göndermeye çalıştığımda bir istisna atıldı. onReceive()
'un hiçbir konuya başlamaması gerektiğini okudum. peşin
Teşekkür
+1 Cevabınızı sorunuza cevaplamak için +1 cevabınız için D –