2011-06-28 7 views
7

Jestem w stanie słuchać Intent Intent.ACTION_BATTERY_CHANGED w mojej działalności i działa świetnie. Próbowałem definiowania odbiornik w manifeście:Android BroadcastReceiver 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> 

ale to nie działa, czytałem post na tutaj mówiąc, że to musi być zdefiniowane programowo. Zamiast rejestrować się dla odbiorcy w mojej Działalności, chciałem osiągnąć to w usłudze, aby stale monitorować. Udało mi się to osiągnąć i działa, ale chciałem sprawdzić swoją pracę, aby sprawdzić, czy jest to właściwe podejście.

Zacząłem od rozciągającej 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); 
       } 
      } 
     } 
    } 
} 

I wtedy skorzystać z usługi, aby najpierw zarejestrować słuchawkę w onCreate() a następnie obsługiwać zdarzenia w onStart(). My BroadcastReceiver uruchamia usługę, jeśli poziom jest poniżej progu.

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); 
    } 
} 

Czy to jest prawidłowe podejście? Należy zarejestrować odbiorcę w onCreate(), a następnie uruchomić usługę po otrzymaniu zdarzenia. Najpierw próbowałem nie korzystać z Usługi, ale nie mam możliwości zarejestrowania odbiornika, ponieważ nie można go uzyskać w manifeście. Po drugie wyjątek został wysłany, gdy próbowałem wysłać wiadomość tekstową w numerze onReceive(). Przeczytałem, że onReceive() nie powinien zaczynać żadnych wątków.

góry dzięki

+0

+1 za umieszczenie mojej odpowiedzi na pytanie: D –

Odpowiedz

2

Tak, to wygląda bardzo dobrym podejściem. Jest to dość podobne (właściwie nieco lepsze, jak bym powiedział) niż to, co robię z moją aplikacją (która działa dobrze od lat).

+0

wielkie dzięki za odpowiedź. – Bear

+1

@Darshan! Czy możesz dodać odpowiedź w swojej odpowiedzi, a nie pytanie, ponieważ teraz jest to dość mylące. –

+0

@ShajeelAfzal Nie rozumiem. To jest moja odpowiedź. Moja odpowiedź była taka, że ​​podejście Misia pojawiało się po kilku błędnych krokach, podejście przedstawione w pytaniu, jest rzeczywiście odpowiednie, podobne do podejścia, które stosowałem w produkcji od siedmiu lat. –