Android BroadcastReceiver傳輸機制詳解
Broadcast
應用程序之間傳輸信息的機制
BroadcastReceiver
接收來自系統(tǒng)和應用中的廣播
作用:在特定時間發(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ā)現(xiàn)普通廣播無法中斷廣播的發(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","廣播處理的數(shù)據(jù)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得到的數(shù)據(jù)"+test );
}
}
發(fā)現(xiàn)普通廣播無法傳送數(shù)據(jù)
有序廣播(ordered broadcasts)
按照接收者的優(yōu)先級順序接收廣播,優(yōu)先級在intent-filter中的priority中聲明。-1000到1000之間,值越大,優(yōu)先級越高??梢越K止廣播意圖的繼續(xù)傳播,接收者可以篡改內(nèi)容
特點:
- 同級別接收順序是隨機的
- 能截斷廣播的繼續(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ā)現(xiàn)有序廣播可以實現(xiàn)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ā)送完廣播要卸載
到此這篇關于Android BroadcastReceiver傳輸機制詳解的文章就介紹到這了,更多相關Android BroadcastReceiver 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
ExpandableListView實現(xiàn)手風琴效果
這篇文章主要為大家詳細介紹了ExpandableListView實現(xiàn)手風琴效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08
Android開發(fā)Flutter?桌面應用窗口化實戰(zhàn)示例
這篇文章主要為大家介紹了Android開發(fā)Flutter?桌面應用窗口化實戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-09-09
Android RippleDrawable 水波紋/漣漪效果的實現(xiàn)
這篇文章主要介紹了Android RippleDrawable 水波紋/漣漪效果的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-08
學習使用Material Design控件(二)使用DrawerLayout實現(xiàn)側(cè)滑菜單欄效果
這篇文章主要為大家介紹了學習使用Material Design控件的詳細教程,使用DrawerLayout和NavigationView實現(xiàn)側(cè)滑菜單欄效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07

