Android四大組件——BroadcastReceiver

1廣播的分類

標(biāo)準(zhǔn)廣播:完全異步的廣播,一旦發(fā)出后,所有監(jiān)聽它的廣播都會在同一時間收到該信息。
有序廣播:同步執(zhí)行的廣播,優(yōu)先級高的接收器會先收到消息,并且可被截?cái)唷?/p>

2廣播的注冊與接收

動態(tài)注冊

public class MainActivity extends AppCompatActivity {
    private IntentFilter intentFilter;
    private MyReceiver receiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        intentFilter = new IntentFilter();
        receiver = new MyReceiver();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        registerReceiver(receiver, intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //動態(tài)注冊的廣播要在onDestroy()方法中取消注冊
        unregisterReceiver(receiver);
    }
}

廣播接收器類

public class MyReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "network changes", Toast.LENGTH_SHORT).show();
    }
}
GIF.gif

靜態(tài)注冊

在<receiver>標(biāo)簽下通過<intent-filter>標(biāo)簽添加<action>標(biāo)簽來實(shí)現(xiàn)

        <receiver
            android:name=".MyReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <!--開機(jī)監(jiān)聽-->
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

注意相應(yīng)權(quán)限的添加

發(fā)送自定義廣播

標(biāo)準(zhǔn)廣播

        <receiver
            android:name=".MyBroadcastReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.example.shaw.myapplication.MyBroadcastReceiver"/>
            </intent-filter>
        </receiver>
       button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new
                        Intent("com.example.shaw.myapplication.MyBroadcastReceiver");
                sendBroadcast(intent);
            }
        });
GIF.gif

有序廣播

        <receiver
            android:name=".OrderBroadcastReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter android:priority="100"> <!-- 設(shè)置接收器的優(yōu)先級 -->
                <action android:name="com.example.shaw.myapplication.OrderBroadcastReceiver" />
            </intent-filter>
        </receiver>
        <receiver
            android:name=".OrderBroadcastReceiver2"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.example.shaw.myapplication.OrderBroadcastReceiver" />
            </intent-filter>
        </receiver>

有序廣播的發(fā)送

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new
                        Intent("com.example.shaw.myapplication.OrderBroadcastReceiver");
                //第二個參數(shù)為與權(quán)限相關(guān)的字符串,null表示所有接收器都可以接收
                sendOrderedBroadcast(intent,null);
            }
        });

廣播接收器1

public class OrderBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("OrderBroadcastReceiver", "OrderBroadcastReceiver in received");
        //截?cái)鄰V播
        abortBroadcast();
    }
}

廣播接收器2

public class OrderBroadcastReceiver2 extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("OrderBroadcastReceiver", "OrderBroadcastReceiver2 in received");
    }
}

運(yùn)行結(jié)果為

圖片.png

從Log打印日志可看出廣播接收器2沒有接受到廣播,也就說明了廣播被接收器1截?cái)嗔?/p>

本地廣播

產(chǎn)生原因:系統(tǒng)全局廣播因?yàn)榭赡鼙黄渌麛?shù)據(jù)截?cái)嘣斐蓴?shù)據(jù)泄露,其他程序也可能向我們的廣播接收器發(fā)送垃圾廣播。
本地廣播只能在程序內(nèi)部進(jìn)行傳遞。

        localBroadcastManager = LocalBroadcastManager.getInstance(this);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent("com.example.shaw.myapplication.LOCAL_BROADCAST");
                //使用LocalBroadcastManager實(shí)例發(fā)送本地廣播
                localBroadcastManager.sendBroadcast(intent);
            }
        });
        intentFilter = new IntentFilter();
        intentFilter.addAction("com.example.shaw.myapplication.LOCAL_BROADCAST");
        //注冊本地廣播監(jiān)聽器
        localBroadcastManager.registerReceiver(localReceiver, intentFilter);
        registerReceiver(localReceiver2, intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //使用LocalBroadcastManager實(shí)例取消注冊
        localBroadcastManager.unregisterReceiver(localReceiver);
        unregisterReceiver(localReceiver2);
    }

public class LocalReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("LocalReceiver", "LocalReceiver received");
    }
}
public class LocalReceiver2 extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("LocalReceiver", "LocalReceiver2 received");
    }
}
圖片.png

該例子中,localReceiver采用的本地廣播注冊,而localReceiver2采用的是標(biāo)準(zhǔn)廣播注冊,從Log日志打印中可看出localReceiver2確實(shí)沒有接收到該廣播。

注意:本地廣播只能采用動態(tài)注冊的方式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容