網站首頁 編程語言 正文
Broadcast
應用程序之間傳輸信息的機制
BroadcastReceiver
接收來自系統和應用中的廣播
作用:在特定時間發(fā)送特定的標識,讓程序進行操作
使用方法
注:
- BroadcastReceiver生命周期只有十秒左右
- BroadcastReceiver里不能做一些比較耗時的操作
- 應該通過Intent給Service,有Service完成
- 不能使用子線程
廣播的種類
普通廣播(Normal broadcasts)
所有監(jiān)聽該廣播的廣播接收者都可以監(jiān)聽到該廣播
特點:
- 同級別接收先后是隨機的
- 級別低的后收到廣播
- 接收器不能截斷廣播的繼續(xù)傳播也不能處理廣播
- 同級別動態(tài)注冊高于靜態(tài)注冊
package com.example.broadcastsdemo;
import androidx.appcompat.app.AppCompatActivity;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void doclick(View view) {
switch (view.getId()){
case R.id.send1: //發(fā)送一條普通廣播
Intent intent = new Intent();
intent.putExtra("msg","這是一條普通廣播");
intent.setAction("BC_MSG");
intent.setComponent(new ComponentName("com.example.broadcastsdemo", "com.example.broadcastsdemo.BC1"));
sendBroadcast(intent);
Log.e("TAG", "doclick: 點擊發(fā)送廣播");
break;
}
}
}
xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center|top" xmlns:android="http://schemas.android.com/apk/res/android"> <Button android:onClick="doclick" android:id="@+id/send1" android:text="發(fā)送一條普通廣播" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout>
BC1
package com.example.broadcastsdemo;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class BC1 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String msg = intent.getStringExtra("msg");
Log.e("TAG", "BC1接收到的廣播信息 "+msg);
}
}
高版本需要用intent.setComponent指定接收者包路徑和類路徑
如果需要發(fā)給多個類廣播,就使用intent.setPackage(“com.example.broadcastsdemo”);
同一包下的BroadcastReceiver都可以接收到廣播
設置優(yōu)先級
<receiver android:name=".BC1" android:enabled="true" android:exported="true"> <intent-filter android:priority="100"> <action android:name="BC_MSG"/> </intent-filter> </receiver> <receiver android:name=".BC2" android:enabled="true" android:exported="true"> <intent-filter android:priority="400"> <action android:name="BC_MSG"/> </intent-filter> </receiver>
只需要在intent-filter中設置android:priority就可以了
值-1000到1000越大優(yōu)先級越高
截斷廣播
public class BC2 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String msg = intent.getStringExtra("msg");
Log.e("TAG", "BC2接收到的廣播信息 "+msg);
abortBroadcast();
}
}
使用 abortBroadcast();關鍵字
發(fā)現普通廣播無法中斷廣播的發(fā)送
靜態(tài)注冊是在xml中注冊
動態(tài)注冊
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
IntentFilter intentFilter = new IntentFilter("BC_MSG");
BC2 bc2 = new BC2();
registerReceiver(bc2,intentFilter);
}
動態(tài)注冊大于靜態(tài)注冊,但是他的作用域太低,容易死掉
測試BC1發(fā)廣播BC2收
public class BC1 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String msg = intent.getStringExtra("msg");
Log.e("TAG", "BC1接收到的廣播信息 "+msg);
Bundle bundle = new Bundle();
bundle.putString("test","廣播處理的數據BC1");
setResultExtras(bundle);
}
}
public class BC2 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String msg = intent.getStringExtra("msg");
Log.e("TAG", "BC2接收到的廣播信息 "+msg);
// abortBroadcast();
Bundle bundle = getResultExtras(true);
String test = bundle.getString("test");
Log.e("TAG", "BC2得到的數據"+test );
}
}
發(fā)現普通廣播無法傳送數據
有序廣播(ordered broadcasts)
按照接收者的優(yōu)先級順序接收廣播,優(yōu)先級在intent-filter中的priority中聲明。-1000到1000之間,值越大,優(yōu)先級越高。可以終止廣播意圖的繼續(xù)傳播,接收者可以篡改內容
特點:
- 同級別接收順序是隨機的
- 能截斷廣播的繼續(xù)傳播,高級別的廣播接收器收到該廣播后,可以決定把該廣播是否截斷
- 接收器能截斷廣播的繼續(xù)傳播,也能處理廣播
- 同級別動態(tài)注冊高于靜態(tài)注冊
添加按鈕
<?xml version="1.0" encoding="utf-8"?> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center|top" xmlns:android="http://schemas.android.com/apk/res/android"> <Button android:onClick="doclick" android:id="@+id/send1" android:text="發(fā)送一條普通廣播" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <Button android:onClick="doclick" android:id="@+id/send2" android:text="發(fā)送一條有序廣播" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout>
添加事件處理
case R.id.send2: //發(fā)送一條普通廣播
Intent intent2 = new Intent();
intent2.putExtra("msg","這是一條有序廣播");
intent2.setAction("BC_MSG");
//intent.setComponent(new ComponentName("com.example.broadcastsdemo", "com.example.broadcastsdemo.BC1"));
intent2.setPackage("com.example.broadcastsdemo");
sendOrderedBroadcast(intent2,null);
Log.e("TAG", "doclick: 點擊發(fā)送有序廣播");
break;
發(fā)現有序廣播可以實現BC2發(fā)消息給BC1,且可以中斷廣播
異步廣播(粘滯性滯留廣播)
不能將處理結果傳給下一個接收者,無法終止廣播
添加按鈕及事件
<Button android:onClick="doclick" android:id="@+id/send3" android:text="發(fā)送一條異步廣播" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
case R.id.send3: //發(fā)送一條異步廣播
Intent intent3 = new Intent();
intent3.putExtra("msg","這是一條有序廣播");
intent3.setAction("BC_MSG");
//intent3.setComponent(new ComponentName("com.example.broadcastsdemo", "com.example.broadcastsdemo.BC3"));
intent3.setPackage("com.example.broadcastsdemo");
sendStickyBroadcast(intent3);
IntentFilter intentFilter = new IntentFilter("BC_MSG");
BC3 bc3 = new BC3();
registerReceiver(bc3,intentFilter);
break;
可以發(fā)送和接收分開,先發(fā)送再接收
發(fā)送完廣播要卸載
原文鏈接:https://blog.csdn.net/liuwushuang233/article/details/126365731
相關推薦
- 2023-04-17 Linux下is?not?in?the?sudoers?file的解決方案_linux shell
- 2022-09-02 Redis?單機安裝和哨兵模式集群安裝的實現_Redis
- 2022-07-20 如何go語言比較兩個對象是否深度相同_Golang
- 2022-03-31 C語言運算符的重載詳解_C 語言
- 2022-05-26 Python?if?else語句對縮進的要求_python
- 2022-02-12 Flutter項目中有些依賴不支持64位的library的解決方式
- 2022-02-02 css 水波紋效果
- 2023-04-19 yarn : 無法加載文件 D:xx\yarn.ps1,因為在此系統上禁止運行腳本。有關詳細信息,請
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支