注冊廣播的兩種方式:動態廣播和靜態廣播的區別和用法


  今天介紹一下Android的四大組件之一的BroadCastReceiver,即廣播。廣播類似於JAVA設計模式中的觀察者模式,即當被觀察者數據變化的時候,會去通知觀察者做相應處理。這里也是一樣,當發出廣播的時候,那么注冊過該廣播的人,就能收到這個廣播,進而做一些工作。

  上面說的廣播注冊,在Android中有兩種方式,即動態注冊(代碼注冊)、靜態注冊(清單文件注冊),下面我以Android中網絡狀態變化發出的廣播作為例子,看看這兩種方式的具體用法。

 


動態注冊:即用代碼動態的注冊、注銷廣播

public class DynamicInternetActivity extends AppCompatActivity {

    private InternetDynamicBroadCastReceiver mReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dynamic_lock_screen);

        IntentFilter filter = new IntentFilter();
        filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
        mReceiver = new InternetDynamicBroadCastReceiver();
        this.registerReceiver(new InternetDynamicBroadCastReceiver(), filter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(mReceiver);
    }

    public class InternetDynamicBroadCastReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(DynamicInternetActivity.this,"網絡發生了變化",Toast.LENGTH_SHORT).show();
        }
    }
}

  在清單文件中注冊該廣播接受者。

<receiver android:name=".broadcastreceiver.net_monitor.DynamicInternetActivity$InternetDynamicBroadCastReceiver"/>

 

  注意:上面在onDestroy方法中,必須注銷廣播,否則有內存泄漏的風險!!!

 


靜態廣播:把廣播寫死在manifest.xml中

public class InternetStaticBroadCastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"網絡發生了變化",Toast.LENGTH_SHORT).show();
    }
}

在清單文件中注冊該廣播接受者。

<receiver android:name=".broadcastreceiver.net_monitor.InternetStaticBroadCastReceiver">
    <intent-filter>
        <!--<action android:name="ConnectivityManager.CONNECTIVITY_ACTION"/>//這樣寫是不對的-->
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>//此處必需指定action,否則監聽不到
    </intent-filter>
</receiver>

  注意:靜態注冊的廣播,必需單獨成一個類,不能像動態注冊那樣寫在某個界面里。否則當監聽到網絡狀態變化的時候,會拋出異常。

 

動態注冊和靜態注冊的區別:

  動態注冊的廣播會受Activity的生命周期的影響, 當Activity銷毀的時候,廣播就失效了。

  而靜態注冊的廣播,即使Activity銷毀了,仍然可以收到廣播。更牛掰的是即使殺死進程,仍然可以收到廣播,關於這點不同的手機測試的結果是不同的,為了驗證這個問題,我用的是google的nexus手機測試的。

  在Android中,有一些action是不支持靜態注冊的:

    android.intent.action.SCREEN_ON

    android.intent.action.SCREEN_OFF

    android.intent.action.BATTERY_CHANGED

    android.intent.action.CONFIGURATION_CHANGED

    android.intent.action.TIME_TICK

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM