Android學習筆記(十一)BroadcastReceiver動態注冊、注銷示例


  在上一篇博文中簡單介紹了一下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     @Override
13     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的消息。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM