BroadcastReceiver本意是廣播接收者。這個也是android四大組件之一,廣播其實我們也不難理解它,打個簡單的比方,比如我們上課時,只要聽到下課的鈴聲,這說明就要下課。在安卓中,廣播是全局性的,每個應用都有可能接受到。下面就學習下怎麼用廣播接受者:
接下來我們就學習以下知識
- 靜態註冊廣播
- 動態註冊廣播
- 普通廣播
- 有序廣播
靜態註冊廣播
靜態註冊就是在清單文件裏面註冊
<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