Broadcast 是廣播接收器 可以被動接收其他應用程式/狀態等等
主要需要 IntentFilter 過濾/增加intent 跟一個Reciever接收
分為靜態註冊 跟 動態註冊
靜態註冊 >mainefest.xml +
動態註冊 >程序要打開才可以接收廣播 並可以自由控制註冊跟取消
動態註冊
//要先引用註冊器
private CustomReciever customReciever=new CustomReciever();
//Oncreate
//intent注入
IntentFilter filter=new IntentFilter();
filter.addAction(Intent.ACTION_POWER_CONNECTED);
filter.addAction(Intent.ACTION_POWER_DISCONNECTED);
//註冊
this.registerReceiver(customReciever,filter);
-------------------------
OnDestroy
this.unregisterReceiver(customReciever);
--------------------------------
註冊器
new>Other>broadcastreciever
//OnRecieve
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
String intentAct=intent.getAction();
if (intentAct !=null){
String toast="test";
switch (intentAct){
case Intent.ACTION_POWER_CONNECTED:
toast="connected";
break;
case Intent.ACTION_POWER_DISCONNECTED:
toast="unconnected";
break;
case "com.example.Broadcast.ACTION_CUSTOM_BROADCAST":
toast="custom";
break;
}
Toast.makeText(context, toast, Toast.LENGTH_SHORT).show();
}
靜態註冊+本地廣播
本地廣播原理:https://blog.csdn.net/u010687392/article/details/49744579
//OnCreate
LocalBroadcastManager.getInstance(this).registerReceiver( customReciever,newIntentFilter("com.example.Broadcast.ACTION_CUSTOM_BROADCAST"));
//OnDestroy
LocalBroadcastManager.getInstance(this).unregisterReceiver(customReciever);
//多一個send
public void sendCustomBroadcast(View view) {
Intent custom=new Intent("com.example.Broadcast.ACTION_CUSTOM_BROADCAST");
LocalBroadcastManager.getInstance(this).sendBroadcast(custom);
}
//manifest.xml
<receiver
android:name=".CustomReciever"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.Broadcast.ACTION_CUSTOM_BROADCAST"/>
</intent-filter>
</receiver>
普通廣播是異步的。正常廣播的接收者通常會同時以不確定的順序運行。要發送常規廣播,請創建廣播意圖並將其傳遞給sendBroadcast(Intent)。
本地廣播被發送到與發送者在同一應用中的接收者 較為安全。要發送本地廣播,請創建廣播意圖並將其傳遞給LocalBroadcastManager.sendBroadcast。
有序廣播一次傳送到一個接收機。當每個接收器執行時,它可以將結果傳播到下一個接收器,或者可以取消廣播,以使廣播不會傳遞到其他接收器。要發送有序廣播,請創建廣播意圖並將其傳遞給sendOrderedBroadcast(Intent, String)。
normal broadcast 所有人都會同時收到訊息 不分先後順序
order broadcast 有先後順序 故可以阻斷
動態註冊要打開程序才能接收到廣播(可以自由控制註冊與取消)
創一個類繼承broadcast 並重寫class中的onRecieve方法
private IntentFilter intentFilter;
private NetworkChangeReciever networkChangeReciever; // 繼承broadcast
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intentFilter = new IntentFilter();
intentFilter.addAction("com.example.broadcast.LOCAL_BROADCAST"); //網路狀態改變
networkChangeReciever = new NetworkChangeReciever();
registerReceiver(networkChangeReciever,intentFilter);
Button button=(Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(
"com.example.broadcast.MY_BROADCAST"
);
sendBroadcast(intent);
}
});
// 動態註冊廣播一定要取消註冊
protected void onDestroy(){
super.onDestroy();
unregisterReceiver(networkChangeReciever);
}
class NetworkChangeReciever extends BroadcastReceiver {
// @Override
// //繼承方法 網路發生變化
// public void onReceive(Context context, Intent intent){
// ConnectivityManager connectionManager= (ConnectivityManager)
// getSystemService(Context.CONNECTIVITY_SERVICE);
// 服務類專門看網路的
// NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
// if (networkInfo != null && networkInfo.isAvailable()) {
// Toast.makeText(context, "network is available",
// Toast.LENGTH_SHORT).show();
// } else {
// Toast.makeText(context, "network is unavailable",
// Toast.LENGTH_SHORT).show();
// }
然後記得拿權限 在manifest.xml中加入 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
--
靜態註冊不用打開程序也能聽到廣播 在這裡我們透過這個原則實現開機廣播
創一個實例 BootCompleteReciever
但在manifest裡面要多註冊這步驟
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<receiver
android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="true"></receiver>
標籤
intent-filter <action android:name="android.intent.ation.BOOT_COMPLETED"/>
自定義廣播
先新創一個
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
Toast.makeText(context, "recieve in my",
Toast.LENGTH_SHORT).show();
abortBroadcast();
// 截斷 後面收不到
throw new UnsupportedOperationException("Not yet implemented");
}
}
manifest
<receiver
android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="100"> //priority是先後順序
<action android:name="com.example.broadcast.MY_BROADCAST"/>
</intent-filter>
</receiver>
測試有序廣播
開第二個專案
public class AnotherBroadcastReciever extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
Toast.makeText(context,"recieved in b ",Toast.LENGTH_SHORT).show();
throw new UnsupportedOperationException("Not yet implemented");
}
}
<receiver
android:name=".AnotherBroadcastReciever"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.broadcast.MY_BROADCAST"/>
//接第一支專案的action
</intent-filter>
</receiver>
mainactivity.java
下面測試本地廣播 本地廣播安全性比較高 不會被其他城市呼叫
就只是多個本地廣播監聽器而已
public class MainActivity extends AppCompatActivity {
private IntentFilter intentFilter;
private LocalReceiver localReceiver;
private LocalBroadcastManager localBroadcastManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
localBroadcastManager= LocalBroadcastManager.getInstance(this);
Button button=(Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
Intent intent=new Intent("com.example.broadcast.LOCAL_BROADCAST"
);
localBroadcastManager.sendBroadcast(intent);
//sendOrderBroadcast(intent); 有先後順序
}
});
intentFilter = new IntentFilter();
intentFilter.addAction("com.example.broadcast.LOCAL_BROADCAST");
localReceiver =new LocalReceiver();
localBroadcastManager.registerReceiver(localReceiver,intentFilter);
}
class LocalReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent){
Toast.makeText(context, "yes",
Toast.LENGTH_SHORT).show();
}
重要提示:儘管意圖既用於發送廣播,也用於通過發起活動startActivity(Intent),但這些動作是完全無關的。廣播接收者無法看到或捕獲Intent用於啟動活動的。同樣,播放時Intent,您不能使用它Intent來查找或開始活動。
廣播接收器是Android應用程序的基本組件。
廣播接收器可以接收系統或應用發送的廣播。
將Intent在廣播機構使用的是用於啟動活動的意圖完全不同。
要處理Intent與廣播關聯的傳入消息,請對BroadcastReceiver類進行子類化並實現onReceive()。
您可以在Android清單文件中或以編程方式註冊廣播接收器。
本地廣播是您的應用私有的。要註冊和發送本地廣播,請使用LocalBroadcastManager。本地廣播不涉及進程間通信,這使它們高效。使用本地廣播還可以保護您的應用程序免受某些安全問題的影響,因為數據保留在您的應用程序內部。
要Intent為廣播創建唯一的動作名稱,通常的做法是在動作名稱之前添加程序包名稱。
如果您的應用定位到API級別26或更高級別,則不能使用清單為大多數隱式廣播聲明接收方。(隱式廣播(包括大多數係統廣播)是不針對您的應用的廣播。)少數隱式廣播是例外。但是,您可以使用動態接收器來接收所有廣播。