Android中的BroadcastReceiver基礎(chǔ)用法記錄

一,BroadcastReceiver簡(jiǎn)單理解

BroadcastReceiver是安卓四大組件之一,在開發(fā)用應(yīng)用到的場(chǎng)景也很多。廣播接收器,就是一個(gè)全局的監(jiān)聽器,分為兩種角色:‘廣播發(fā)送者’,‘廣播接收者’。監(jiān)聽或者接收應(yīng)用發(fā)出的廣播消息,并做出相應(yīng)的操作。一般應(yīng)用在:不同組件間的通信,多線程通信,Android系統(tǒng)廣播。如:網(wǎng)絡(luò)狀態(tài)是否可用,開機(jī)時(shí)。
采用的設(shè)計(jì)模式是觀察者模式。
1,自定義一個(gè)廣播接收器
繼承BroadcastReceiver
重寫onReceive()方法
注意:廣播接收器運(yùn)行在主線程中,所以onReceive()方法中不能執(zhí)行耗時(shí)操作,會(huì)引起ANR問題

public class MyBroadcast extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String string=intent.getAction();
        //接收到廣播需要做的操作。此處我們打印一個(gè)提示
        Toast.makeText(context,string,Toast.LENGTH_LONG).show();
    }
}

2,廣播注冊(cè)方式有兩種:動(dòng)態(tài)注冊(cè),靜態(tài)注冊(cè),
靜態(tài)注冊(cè):
在AndroidManifest.xml中添加<receiver>標(biāo)簽

 <receiver
            android:name=".broad.MyBroadcast"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                //自定義廣播
                <action android:name="com.dream.broadcasttest.MY_BROADCAST"></action>
            </intent-filter>
        </receiver>

動(dòng)態(tài)注冊(cè)
注意:動(dòng)態(tài)注冊(cè)一定要注銷。否則會(huì)出現(xiàn)內(nèi)存泄露的問題

public class MainActivity2 extends AppCompatActivity {
    private Button button,button2;
    private MyBroadcast myBroadcast;
    private IntentFilter intentFilter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        button = (Button) findViewById(R.id.but_broad);
        button2=(Button)findViewById(R.id.but_broad_send);
        myBroadcast = new MyBroadcast();
        intentFilter = new IntentFilter();
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //動(dòng)態(tài)注冊(cè)廣播
                intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
                registerReceiver(myBroadcast, intentFilter);
            }
        });
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //自定義廣播
                Intent intent=new Intent("com.dream.broadcasttest.MY_BROADCAST");
                intent.setPackage(getPackageName());
                sendBroadcast(intent);
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //動(dòng)態(tài)注冊(cè)廣播之后需要在onDestroy中取消注冊(cè)
        unregisterReceiver(myBroadcast);
    }
}

兩種注冊(cè)方式的區(qū)別:


區(qū)別

3,廣播的類型主要有五種
普通廣播 Normal Broadcast
系統(tǒng)廣播 System Broadcast
有序廣播 Ordered Broadcast
粘性廣播 Sticky Broadcast
APP應(yīng)用內(nèi)廣播 Local Broadcast
普通廣播也是自定義廣播,是比較常用的。
系統(tǒng)廣播


1210268-20180124193127334-2118311592.png

有序廣播和普通廣播一樣,只是發(fā)送廣播的方法是
sendOrderedBroadcast(intent);

有序廣播接收者接收廣播的順序規(guī)則

  • 按照priority屬性值大小排序
  • priority值相同時(shí),動(dòng)態(tài)廣播優(yōu)先

在這里插播一下,Android 9.0對(duì)廣播的重大調(diào)整,為提高安卓系統(tǒng)的安全性,從9.0開始系統(tǒng)全面禁止靜態(tài)注冊(cè)的廣播,凡是靜態(tài)廣播在9.0系統(tǒng)中都不再有效,因此為了適配Android 9.0,靜態(tài)注冊(cè)廣播都要換成在代碼中動(dòng)態(tài)注冊(cè)廣播。
如果9.0想要發(fā)送靜態(tài)廣播,那么要發(fā)送定向廣播才可以接收到靜態(tài)廣播。如下
AndroidManifest中靜態(tài)注冊(cè)

<receiver android:name="com.dream.broad.MyBroadcast"
            android:exported="true">
     <intent-filter>
          <action android:name="com.dream.broadcasttest.MY_BROADCAST"/>
     </intent-filter>
</receiver>

發(fā)送時(shí)候指定包名com.dream.broad.MyBroadcast

Intent poweronff = new Intent();
poweronff.setPackage("com.dream.broad");
poweronff.setAction("com.bob.intent.action.POWER_ON_OFF_TIMER");
poweronff.putExtra("enable",true);
poweronff.putExtra("timeon",poweron);
poweronff.putExtra("timeoff",poweroff);
sendBroadcast(poweronff);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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