Android廣播機制(1)

簡介

就是由於安卓中的每一個應用程序均可以對本身感興趣的廣播進行註冊,這樣改程序就只會接收到本身所關心的廣播內容,這些廣播多是來自於系統的,也多是來自於其餘應用程序的android

發送廣播和接收廣播方式

發送廣播:Intent
接收廣播:廣播接收器(Broadcast Receiver)安全

廣播類型

標準廣播:標準廣播是一種徹底異步執行的廣播,在廣播發出以後,全部的廣播接收器幾乎都會在同一時刻接受到這條廣播消息。所以它們之間沒有任何前後順序可言,這種廣播的效率比較高,但同時也意味着它是沒法被截斷的。
有序廣播:有序廣播則是一種同步執行廣播,在廣播發出以後,同一時刻只會有一個廣播接收器可以接受到這條廣播信息。但這個廣播進入其中的邏輯執行完畢後,廣播纔會繼續傳遞。因此此時的廣播計數器是有前後順序的,優先級高的廣播接收器就能夠先接受到廣播消息,並且,而且前面的廣播接收器還能夠階段正在傳遞的廣播,這樣後面的廣播接收器就沒法受到廣播消息了。網絡

接收系統廣播

Android具備不少內置廣播
註冊廣播的方式:app

動態註冊:在代碼中註冊
靜態註冊:在AndroidManifest.xml中註冊異步


建立廣播接收器ide

新建一個類繼承自BroadcastReceiver->重寫父類的onReceive()方法當有廣播到來時,onReceive()方法就會執行,具體的邏輯能夠在這個方法中處理。優化

動態註冊監聽網絡變化

public class MainActivity extends AppCompatActivity {
    private IntentFilter intentFilter;
    private NetworkChangeReceiver networkChangeReceiver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        intentFilter=new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");//想監聽什麼廣播就添加相應的action
        networkChangeReceiver=new NetworkChangeReceiver();//廣播接收器
        registerReceiver(networkChangeReceiver,intentFilter);//註冊
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(networkChangeReceiver);//動態註冊的廣播必須取消註冊
    }
    //廣播接收器繼承BroadcastReceiver這個類,每次接收到廣播會調用onReceive()方法
    class NetworkChangeReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
                Toast.makeText(context,"network changes",Toast.LENGTH_SHORT).show();
        }
    }
}

步驟

1.註冊廣播:建立IntentFilter對象->添加廣播對應的action
2.新建廣播接收器繼承自Broadcast類重寫onReceive方法
3.registerReceiver註冊廣播,將IntentFilter對象和廣播接收器實例對象傳進去(這樣廣播和廣播接收器的邏輯就綁定在一塊兒了)
4.動態註冊的廣播必定記得取消註冊unregisterReceiver
**注:Android系統爲了保護用戶設備的安全和隱私作了嚴格的規定,若是程序須要進行一些對於用戶來講比較敏感的操做,就必須在配置文件中聲明權限才能夠,不然程序將會直接崩潰,好比這裏訪問系統的網絡狀態就是須要聲明權限的。打開AndroidManifest.xml文件,加入如下代碼,才能夠訪問系統網絡狀態:.net

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.broadcasttest">
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    ...
</manifest>

優化

告訴用戶當前網絡狀態是可用仍是不可用。修改MainActivity中的代碼:線程

public class MainActivity extends AppCompatActivity {
 ...
 class NetworkChangeReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            ConnectivityManager connectivityManager= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo=connectivityManager.getActiveNetworkInfo();
            if(networkInfo!=null&&networkInfo.isAvailable()){
                Toast.makeText(context,"network is available",Toast.LENGTH_SHORT).show();
            }else{
                Toast.makeText(context,"network is unavailable",Toast.LENGTH_SHORT).show();
            }
        }
  }
}

靜態註冊實現開機啓動

動態註冊廣播接收器能夠自由的控制註冊與註銷,在靈活性方面有很大的優點,可是它也存在着一個缺點即必需要在程序啓動以後才能接受到廣播,由於註冊的邏輯寫在onCreate方法中的3d

步驟

1.建立廣播接收器的快捷方式:右擊com.example.broadcasttest包->New->Other->Broadcast Receive.出現如下窗口後,Exported表示是否容許這個廣播接收器接收本程序以外的廣播,Enable表示是否啓用這個廣播接收器.

2.而後修改BootCompleteReceiver中的代碼:

public class BootCompleteReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"Boot Complete",Toast.LENGTH_SHORT).show();
    }
}

**注:靜態註冊的廣播必定要在AndroidManifest.xml中註冊(快捷方式已經幫咱們完成了) 標籤 ,以下展現:

...
<application
...
       <receiver
            android:name=".BootCompleteReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
...

注意

不要在onReceive()方法中添加過多的邏輯或者進行任何耗時的操做,在廣播接收器中是不容許開啓線程的,當onReceive()運行較長時間卻沒有結束時,程序就會保報錯。所以,廣播接收器更多的是扮演一種打開其餘程序組件的角色,好比建立一條狀態欄通知,或者啓動一個服務。

相關文章
相關標籤/搜索