27 March 2013
Android BroadcastReceiver是一種類似“pending”在背景的服務,
它可以用來監聽、接收某些事件(action),例如開機完成、收到簡訊、電池快沒電等等之類。
以及可以用來作為訊息的傳遞!
而為什麼會說類似pending呢?
因為BroadcastReceiver的lifecycle,並不是一直常駐的,
是只有onReceive被call時,才會存在,當return之後,system會判斷是否要unactive!


BroadcastReceiver可以監聽兩種類型的事件:
1. 系統事件
2. 自己定義的事件
這裡將會實作出這兩種兼聽方式!



首先這裡將實作一個receiver會去監聽以下系統事件
1. 撥打電話
2. 螢幕打開
3. 螢幕關閉


首先先實作一個BroadcastReceiver,如下:
public class ReceiverDetect extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String strAction = intent.getAction();
Log.e("kencyang", "action:" + strAction);

// if you make a phone call...
if (strAction.equals(Intent.ACTION_NEW_OUTGOING_CALL)){
String number = getResultData();
Log.e("kencyang", "number:" +number);
}
}
}




接著我們必須去access 額外的permission才能接收到使用者撥打電話的事件,

<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"></uses-permission>

當然你要在你的AndroidManifest.xml中的加入剛剛實作的BroadcastReceiver,

<receiver android:name="ReceiverDetect">
</receiver>

接著我們將手動地去註冊這個Receiver要接收什麼事件,
以及註冊這個Receiver,
而這些動作我們可以在MainActivity中實作,
public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

IntentFilter ifilter = new IntentFilter();
ifilter.addAction(Intent.ACTION_NEW_OUTGOING_CALL); // if make a phone call
ifilter.addAction(Intent.ACTION_SCREEN_OFF); // if screen turn off
ifilter.addAction(Intent.ACTION_SCREEN_ON); // if screen turn on

ReceiverDetect r = new ReceiverDetect();
registerReceiver(r, ifilter);
}
}

接著就deploy到手機上吧!
可以試試看打一通電話,以及開關螢幕,
然後打開你的ddms,應該就可以看到下列的log,






這樣就完成了監聽系統事件,
接下來要講如何監聽一個自己定義的事件,
其實和監聽系統事件沒有太大的差別,
我們只是增加了一組action!
以及教你怎麼send出一個broadcast,讓你的receiver收到!
一樣在MainActivity中,增加下列的code:
 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

IntentFilter ifilter = new IntentFilter();
ifilter.addAction("i am hungry");

ReceiverDetect r = new ReceiverDetect();
registerReceiver(r, ifilter);


Button btnSend = (Button) findViewById(R.id.button1);

// click button will send a broadcast, then our receiver will receive the action
btnSend.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("i am hungry");
sendBroadcast(intent);
}
});

}



然後deploy上去,
按下button以後,應該會看到下圖中的log!






這樣就完成了BroadcastReceiver的基本實作!







blog comments powered by Disqus