2011-06-28 13 views
7

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

+0

+1 Cevabınızı sorunuza cevaplamak için +1 cevabınız için D –

cevap

2

Evet, bu çok iyi bir yaklaşım gibi görünüyor. Benim app ile yaptığım (yıllardır iyi çalışıyor) olandan oldukça benzer (aslında biraz daha iyi, söyleyebilirim).

+0

çok teşekkürler. – Bear

+1

@Darshan! Cevabınızı cevabınıza sorudan daha çok ekleyebilir misiniz, çünkü şu anda oldukça kafa karıştırıcı. –

+0

@ShajeelAfzal Anlamıyorum. Bu benim cevabım. Benim cevabım Ay'ın, bazı yanlış adımlardan sonra, yaklaşmakta olan yaklaşımdan sonra geldiği yaklaşımın, yedi yıldır üretimde kullandığım yaklaşıma benzeyen uygun bir yaklaşım olduğu yönündeydi. –