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();//截斷廣播
    }
}

再運行下:
這裏寫圖片描述

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

總結:

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

源碼下載

https://github.com/songshuilin/AndroidForBlog/tree/master/androidforbroadcastreceiver

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章