вторник, 7 мая 2013 г.

BroadcastReceiver в Android

Продолжаем разбирать полезные вещи в Android и сегодняшний урок я хотел бы посвятить такой вещи как BroadcastReceiver.
BroadcatReceiver(приемник широковещательных сообщений) - это компонент для получения внешних событий и реакции на них. BroadcastReceiver это объект, который начинает выполнять действия, по получению какого нибудь сигнала (Intent). Сервис в отличии от BroadcastReceiver работает сразу после того как его запустили. У данного класса только один метод onReceive.

 void onReceive(Context curContext, Intent broadcastMsg)   

Когда широковещательное сообщение прибывает для получателя сообщения, Android вызывает его методом onReceive() и передает в него объект Intent, содержащий сообщение. Приемник широковещательных сообщений является активным только во время выполнения этого метода.

Android использует широковещательные сообщения для системных событий, таких как уровень зарядки батареи, сетевые подключения, входящие звонки, изменения часового пояса, состояние подключения данных, входящие сообщения SMS или обращения по телефону.

Рассмотрим такой пример : 
 import android.os.Bundle;  
 import android.app.Activity;  
 import android.content.BroadcastReceiver;  
 import android.content.Context;  
 import android.content.Intent;  
 import android.content.IntentFilter;  
 import android.widget.ProgressBar;  
 import android.widget.TextView;  
 public class BatteryIndicatorActivity extends Activity {  
   private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver() {  
     @Override      
     public void onReceive(Context c, Intent i) {  
       int level = i.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);  
       ProgressBar pb = (ProgressBar) findViewById(R.id.progressbar);  
       pb.setProgress(level);  
       TextView tv = (TextView) findViewById(R.id.textfield);  
       tv.setText("Battery Level: " + Integer.toString(level) + "%");  
     }  
   };  
   @Override  
   public void onCreate(Bundle savedInstanceState) {  
     super.onCreate(savedInstanceState);  
     setContentView(R.layout.main);  
     registerReceiver(mBatInfoReceiver, new IntentFilter(  
         Intent.ACTION_BATTERY_CHANGED));  
   }  
 }  

Так а теперь разберемся что я здесь "накалякал". Создаем обьект mBatInfoReceiver , в onReceive получаем уровень батареи через системный Intent  BatteryManager.EXTRA_LEVEL и после этого отображаем информацию в ProgressBar и TextView .  Для того чтобы данный "ресивер" заработал его нужно зарегить. Делается это двумя способами или в onCreate (как сделано у меня выше) или в AndroidManifest.

 <receiver android:name=".SimpleBroadcater" android:label="Simple">  
    <intent-filter>  
     <action android:name="android.intent.action.BATTERY_CHANGED"/>  
    </intent-filter>  
   </receiver>  

Вроде все что хотел в данном уроке описал . Если будут вопросы пишите в комментариях , с удовольствием отвечу.

2 комментария:

  1. Быстро ли приходят интэнты в ресивер, если они кастомные, а не системные? Или несколько миллисекунд есть задержка?

    ОтветитьУдалить