android 静态注册wifi广播,Android中BroadcastReceiver详解
BroadcastReceiver是什么?
Android app可以發送廣播也可以接收系統或者其它app發送的廣播,是發送/訂閱的設計模式。這些廣播被發送當重要的事件發生的時候。例如,安卓系統發送廣播當各種各樣系統事件發生的時候,比如手機啟動了或者手機開始充電了。應用也可以發送自定義廣播,例如通知其它應用一些他們可能感興趣的東西,比如一些新的內容被下載了。
系統廣播會在系統事件發生的時候被發送出來,比如當手機進入或者退出開發者選項的時候,所有訂閱了系統廣播的人都可以收到這個廣播。
廣播它自身是被包裹在了一個Intent里面,它是有一個唯一的標識的(例如android.intent.action.AIRPLANE_MODE)。這個Intent對象同時包含了一些其它的信息,在它的字段里面,飛行模式這個intent里面就包含了一個boolean的字段來表示飛行模式是開啟還是關閉的。
BroadcastReceiver能用來做什么?
接收系統發送出的重要的廣播(網絡變化,開機,充電)
app之間相互通信,相互拉活的手段
app內部組建間通信的手段
BroadcastReceiver分為哪幾類?
從不同的緯度區分,可能分為不同的類別。
系統廣播/非系統廣播
全局廣播/本地廣播
無序廣播/有序廣播/粘性廣播
BroadcastReceiver怎么使用?
1. 注冊廣播
1.1 靜態注冊廣播
1.2 動態注冊廣播
val br: BroadcastReceiver = MyBroadcastReceiver()
val filter = IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION).apply {
addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED)
}
registerReceiver(br, filter)
2. 發送廣播
Intent().also { intent ->
intent.setAction("com.example.broadcast.MY_NOTIFICATION")
intent.putExtra("data", "Notice me senpai!")
sendBroadcast(intent)
}
sendBroadcast(Intent("com.example.NOTIFY"), Manifest.permission.SEND_SMS)
3. 接收廣播
private const val TAG = "MyBroadcastReceiver"
class MyBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
StringBuilder().apply {
append("Action: ${intent.action}\n")
append("URI: ${intent.toUri(Intent.URI_INTENT_SCHEME)}\n")
toString().also { log ->
Log.d(TAG, log)
Toast.makeText(context, log, Toast.LENGTH_LONG).show()
}
}
}
}
android:permission="android.permission.SEND_SMS">
var filter = IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED)
registerReceiver(receiver, filter, Manifest.permission.SEND_SMS, null )
BroadcastReceiver在不同版本的API中有哪些區別?
Android 9
從Android 9(API level 28)開始,NETWORK_STATE_CHANGED_ACTION廣播不會攜帶用戶的地理位置信息或者個人身份數據。 此外,當你的app運行在Android 9或者更高的手機上,系統的wifi廣播也不會攜帶SSIDs, BSSIDs,連接信息或掃描結果。想獲取以上信息,需要通過getConnectionInfo()來代替。
Android 8
從Android 8(API level 27)開始,系統加強了對靜態廣播的進一步限制,許多廣播靜態注冊了也是收不到的,不過你可以采用動態注冊的方式來接收這些廣播。
Android 7
從Android 7(API level 24)開始,系統不會再發送ACTION_NEW_PICTURE,ACTION_NEW_VIDEO的廣播。 同時從7.0開始app想要接受CONNECTIVITY_ACTION廣播,需要通過動態注冊廣播的形式了,再通過靜態廣播注冊的方式是不可以的了。
BroadcastReceiver發送廣播和接收廣播是怎樣工作的?
看圖吧,畫了一幅圖
BroadcastReceiver是怎么引發ANR的?
眾所周知廣播是會造成ANR的,造成ANR就是因為發送方將廣播發送給AMS,然后AMS找有沒有人注冊,找到之后讓它去執行,在執行開始之前AMS就開始為ANR進行耗時統計了,如果這個時候app進程已經存在,那么便把這個消息加入到消息隊列中,等待調度,最后執行完成。如果app不存在,AMS會拉活我們的進程,然后我們的app會執行這個消息,所以如果我們被廣播拉活,我們的啟動時長也是會被統計到ANR的時間范圍內的。 今年年初我花一個月的時間收錄整理了一套知識體系,如果有想法深入的系統化的去學習的,可以點擊傳送門,我會把我收錄整理的資料都送給大家,幫助大家更快的進階。
總結
以上是生活随笔為你收集整理的android 静态注册wifi广播,Android中BroadcastReceiver详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 自定义图片上传,andr
- 下一篇: android intent 分发,An