1. 程式人生 > >android之BroadcastReceiver(廣播接收者)

android之BroadcastReceiver(廣播接收者)

BroadcastReceiver本意是廣播接收者。這個也是android四大元件之一,廣播其實我們也不難理解它,打個簡單的比方,比如我們上課時,只要聽到下課的鈴聲,這說明就要下課。在安卓中,廣播是全域性性的,每個應用都有可能接受到。下面就學習下怎麼用廣播接受者:

接下來我們就學習以下知識

  1. 靜態註冊廣播
  2. 動態註冊廣播
  3. 普通廣播
  4. 有序廣播

靜態註冊廣播

靜態註冊就是在清單檔案裡面註冊

   <receiver
            android:name=".MyReceiver">
            <intent-filter>
<action android:name="edu.jju.broadcastreceiver"> </action> </intent-filter> </receiver>

動態註冊廣播

就是通過java程式碼去註冊而不是在清單檔案裡面去配置

  MyReceiver receiver=new MyReceiver();//廣播接受者例項
        IntentFilter intentFilter=new IntentFilter();
        intentFilter.addAction("edu.jju.broadcastreceiver"
); registerReceiver(receiver,intentFilter);

註冊廣播就是這兩種方式。接下來我們重點學習下普通廣播跟有序廣播

普通廣播

1, 我麼先定義一個類MyReceiver去繼承BroadcastReceiver。並重寫裡面的方法

程式碼如下:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class MyReceiver
extends BroadcastReceiver {
public MyReceiver() { } @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context,"我接受到廣播啦!!!",Toast.LENGTH_SHORT).show(); } }

當有廣播時,就會呼叫onReceive方法

MainActivity.java程式碼如下:


import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

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

    }

    /**
     * 這是繫結按鈕新增的事件
     * @param view
     */
    public void send(View view) {

        /*
        這是通過靜態註冊的廣播
         */
        Intent intent = new Intent();
        intent.setAction("edu.jju.broadcastreceiver");
        sendBroadcast(intent);//傳送普通廣播
    }
}

執行結果:

這裡寫圖片描述

也可以通過動態註冊來實現,可以不需要在清單檔案配置。修改的程式碼如下:

   /**
     * 這是繫結按鈕新增的事件
     * @param view
     */
    public void send(View view) {

        MyReceiver receiver = new MyReceiver();//廣播接受者例項
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("edu.jju.broadcastreceiver");
        registerReceiver(receiver, intentFilter);
        Intent intent = new Intent();
        intent.setAction("edu.jju.broadcastreceiver");
        sendBroadcast(intent);//傳送普通廣播
    }

執行效果是一樣的

有序廣播

接下來我們定義四個廣播來演示下 A B C D,然後它們是接收相同的廣播。

       <receiver android:name=".MyReceiver">
            <intent-filter>
                <action android:name="edu.jju.broadcastreceiver" />
            </intent-filter>
        </receiver>


        <receiver android:name=".MyReceiverA">
            <intent-filter>
                <action android:name="edu.jju.broadcastreceiver" />
            </intent-filter>
        </receiver>

        <receiver android:name=".MyReceiverB">
            <intent-filter>
                <action android:name="edu.jju.broadcastreceiver" />
            </intent-filter>
        </receiver>

        <receiver android:name=".MyReceiverC">
            <intent-filter>
                <action android:name="edu.jju.broadcastreceiver" />
            </intent-filter>
        </receiver>

可以看到,我們是通過靜態註冊的方式,而且是接受相同的廣播, 在每個廣播接收者中列印log

然後執行:

這裡寫圖片描述

可以看到,我們傳送一條廣播,廣播接收者都接受到了該廣播。預設的是按在清單檔案註冊順序接受的。我們可以改它們的優先順序

修改程式碼如下

     <receiver android:name=".MyReceiver">
            <intent-filter android:priority="100">
                <action android:name="edu.jju.broadcastreceiver" />
            </intent-filter>
        </receiver>


        <receiver android:name=".MyReceiverA">
            <intent-filter android:priority="200">
                <action android:name="edu.jju.broadcastreceiver" />
            </intent-filter>
        </receiver>

        <receiver android:name=".MyReceiverB">
            <intent-filter android:priority="50"> 
                <action android:name="edu.jju.broadcastreceiver" />
            </intent-filter>
        </receiver>

        <receiver android:name=".MyReceiverC">
            <intent-filter android:priority="300">
                <action android:name="edu.jju.broadcastreceiver" />
            </intent-filter>
        </receiver>

優先順序設定為MyReceiver 100 , MyReceiverA 200 , MyReceiverB 50 , MyReceiverC 300

再執行下

這裡寫圖片描述

可以看到優先順序高的,先接收到廣播

我們也可以截斷這條廣播,我們就在MyReceiverA 這裡截斷試下

修改下MyReceiverA 程式碼:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class MyReceiverA extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("TAG", " MyReceiverA 廣播 ");
        abortBroadcast();//截斷廣播
    }
}

再執行下:
這裡寫圖片描述

可以看到只有兩個接收到了該廣播,說明是被截斷了

總結:

寫的不是太好,只是講了怎麼用,我也是一名初學者。爭取下次部落格結合案例來寫。

原始碼下載