標籤:

Android學習--廣播機制

Android學習--廣播機制

Android中為了便於系統級別的消息通知,引入了一套類似廣播消息機制。實際上廣播機制也就是為了更好,更方便,更系統地實現通信。

講廣播,肯定離不開發送廣播 和接收廣播 。

那先介紹如何接收廣播

1.接收系統廣播

要接收廣播,首先得有廣播接收器。而廣播接收器是對感興趣的廣播進行註冊,這樣當有廣播發送時,就能接收該廣播。

註冊廣播的方式: 在代碼中註冊的就是動態註冊;在AndroidManifest.xml中註冊是靜態註冊。

動態註冊就更靈活,能自由控制註冊和註銷,但必須要程序啟動後才能接收廣播。

而靜態註冊雖然不那麼靈活,但是這種可以註冊方式可以讓程序在未啟動的情況下接收廣播。

動態註冊監聽網路變化和靜態註冊實現開機啟動是兩個比較簡單的 有可以實現這兩種註冊方式的案例,代碼就不貼了,大家可以自行參閱資料研究一番。

這裡值得注意的是:會遇到Android許可權的問題,需要再AndroidManifest.xml中添加聲明訪問許可權。否則程序會崩潰。

2.發送廣播

廣播有兩種類型:

一種是標準廣播,完全非同步執行的廣播。無先後順序而言,廣播發出,廣播接收器幾乎在同一個時刻接收這條廣播消息,工作方式如圖

另外一種是有序廣播,是一種同步執行的廣播,同一個時刻,只有一個廣播接收器能收到信息,當執行完該廣播接收器中的邏輯,才會繼續傳遞給下一個接受器。

這些發送與接收都是屬於系統全局廣播,也就是說,這樣的廣播任何應用程序都能接受到,這就涉及到一個安全性問題,為了解決安全性問題,Android還可以使用本地廣播,這樣的廣播只能夠在程序內容進行傳遞,接受器也只接收來自本程序應用的廣播。

附上發送標準廣播的代碼。

1.定義一個廣播接收器MyBroadcastReceiver

這裡注意在com.example.broadcasttest包 ->New->Other->Broadcast Receiver 中新建

這裡會系統的得到一個廣播接收器,在manifest中也會有註冊。許可權問題還是要注意

public class MyBroadcastReceiver extends BroadcastReceiver { public MyBroadcastReceiver() { } @Override public void onReceive(Context context, Intent intent) { // TODO: This method is called when the BroadcastReceiver is receiving // an Intent broadcast. Toast.makeText(context,"received in MyBroadcastReceiver",Toast.LENGTH_SHORT).show(); }}

2.main_activity.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width_="match_parent" android:layout_height="match_parent" > <Button android:id="@+id/buttom" android:layout_width_="match_parent" android:layout_height="wrap_content" android:text="Send Broadcast"/></LinearLayout>

3.MainActivity

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); Button button=(Button) findViewById(R.id.buttom); button.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View view) { Intent intent=new Intent("com.example.broadcasttest.MY_BROADCAST"); sendBroadcast(intent); } }); //實例化 發送廣播的對象 intentFilter=new IntentFilter(); //給該對象添加一個action 系統發出一條廣播 intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); //創建接受廣播 的實例化對象 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) { //系統服務類 管理網路連接 ConnectivityManager connectivityManager=(ConnectivityManager)getSystemService(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(); } } }}

推薦閱讀:

Android Sunflower 帶您玩轉 Jetpack
nginx安裝與應用
簡單講講Android系統的特點
如何反編譯Android 5.0 framework
Shader在OpenGL ES中是怎樣一般的存在?

TAG:Android | 廣播 |