標籤:
在上一篇博文中簡單介紹了一下BroadcastReceiver的相關知識點,本篇舉一個在代碼中動態註冊、登出BroadcastReceiver的栗子。
1、首先建立一個MyReceiver並繼承BroadcastReceiver,既然要動態註冊該receiver的話,就無需在AndroidManifest.xml中配置它了:
1 public class MyReceiver extends BroadcastReceiver { 2 public static final String ACTION = "com.codingblock.receive.intent.action.MyReceiver"; 3 4 public MyReceiver() { 5 6 } 7 8 @Override 9 public void onReceive(Context context, Intent intent) {10 System.out.println("接收到的訊息為:" + intent.getStringExtra("data"));11 }12 }
程式碼分析:上面代碼中定義了一個靜態變數ACTION,以方便程式指定該receiver。另外,從onReceive()方法的第二個參數intent可以擷取到傳遞過來的資料。
2、布局檔案如下,很簡單,只有三個按鈕:發送訊息按鈕、註冊receiver按鈕和登出receiver按鈕。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/btn_send_receiver" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="發送訊息" /> <Button android:id="@+id/btn_register_receiver" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="註冊receiver" /> <Button android:id="@+id/btn_unregister_receiver" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="登出receiver" /></LinearLayout>
3、最後在MainActivity中測試一下
1 public class MainActivity extends Activity implements OnClickListener { 2 private MyReceiver receiver = null; 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.activity_main); 7 findViewById(R.id.btn_send_receiver).setOnClickListener(this); 8 findViewById(R.id.btn_register_receiver).setOnClickListener(this); 9 findViewById(R.id.btn_unregister_receiver).setOnClickListener(this);10 }11 12 @Override13 public void onClick(View v) {14 switch (v.getId()) {15 case R.id.btn_send_receiver:16 Intent i = new Intent(MyReceiver.ACTION);17 i.putExtra("data", "來自MainActivity的訊息");18 sendBroadcast(i);19 break;20 case R.id.btn_register_receiver:21 if (receiver == null) {22 System.out.println("註冊receiver");23 receiver = new MyReceiver();24 registerReceiver(receiver, new IntentFilter(MyReceiver.ACTION));25 }26 break;27 case R.id.btn_unregister_receiver:28 if (receiver != null) {29 System.out.println("登出receiver");30 unregisterReceiver(receiver);31 receiver = null;32 }33 break;34 35 default:36 break;37 }38 }39 }
程式碼分析:本段代碼在23行,通過registerReceiver()方法動態註冊了MyReceiver,並且使用過後最好不要忘了用unregisterReceiver()方法再將其登出,登出後應將receiver設為null。
4、運行結果如下
測試就會發現在點擊發送訊息按鈕之前,如果沒有註冊receiver的話是不能成功發送訊息的,只有註冊了receiver,點擊發送訊息log中才有輸出:
從日誌輸出就能看出,當註冊好了receiver後,按下發送訊息按鈕,在MyReceiver中就能收到來自MainActivity的訊息。
Android學習筆記(十一)BroadcastReceiver動態註冊、登出樣本