android之BroadcastReceiver(廣播接收者)
阿新 • • 發佈:2019-02-02
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();//截斷廣播
}
}
再執行下:
可以看到只有兩個接收到了該廣播,說明是被截斷了
總結:
寫的不是太好,只是講了怎麼用,我也是一名初學者。爭取下次部落格結合案例來寫。