初识广播机制(监听网络状态的改变,监听网络是否可以使用)
Android系統中的廣播機制比較靈活,因為Android中的每個應用程序都可以對自己感興趣的廣播進行注冊,這樣該程序就只會接收到自己所關心的廣播內容,這些廣播可能是來自于系統的,也可能是來自于其他應用程序的。Android提供了一套完整的API,允許應用程序自由地發送和接收廣播。
廣播的類型主要可以分為以下兩種:
1.標準廣播(無序廣播)? 特點:無序、異步,幾乎同時接收到
2:.有序廣播? 特點:有序、同步,根據優先級高低執行,可以被截斷
?
標準廣播(無序廣播)Normal broadcast是一種完全異步執行的廣播,在廣播發出之后,所有的廣播接收器幾乎都會在同一時刻接收到這條消息,因為它們之間沒有任何先后順序可言。這種廣播的效率會比較高,但同時也意味著無法被截斷。
?有序廣播Ordered broadcast則是一種同步執行的廣播,在廣播發出之后,同一時刻只會有一個廣播接收器能夠收到這條廣播消息,當這個廣播接收器中的邏輯執行完畢后,廣播才會繼續傳遞。所以此時的廣播接收器是有一個先后順序的,優先級高的廣播接收器就可以收到廣播消息,并且前面的廣播接收器還可以截斷正在傳遞的廣播,這樣后面的廣播接收器就無法收到廣播消息了。
?Android內置了很多系統級別的廣播,我們可以在應用程序中通過監聽這些廣播來得到各種系統的狀態信息。比如手機開機完成后會發出一條廣播,電池的電量發生變化發出一條廣播,時間或時區發生改變也會發出一條廣播,等待。如果想要接收到這些廣播,那么我們就需要了解廣播接收器,并學會使用它。
廣播接收器可以自由地對自己感興趣的廣播進行注冊,這樣當有相應的廣播發出時,廣播接收器就能夠收到該廣播,并在內部處理相應的邏輯。
注冊廣播的方式有兩種:
第一種是靜態注冊,直接在AndroidManifest.xml中注冊
第二種是動態注冊,直接在代碼中注冊
那么該如何創建一個廣播接收器呢?其實只需要新建一個類,讓它繼承自BroadcastReceiver,并重寫父類的onReceive()方法就行了。這樣當有廣播到來時,onReceive()方法就會得到執行。
我們這里通過動態注冊的方式編寫一個能夠監聽網路變化的程序。
MainActivity.java代碼:
package com.example.administrator.broadcasttest;import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.Toast;public class MainActivity extends AppCompatActivity {private NetworkChangeReceiver receiver;private IntentFilter intentFilter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);receiver = new NetworkChangeReceiver();intentFilter = new IntentFilter();intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");registerReceiver(receiver, intentFilter);}@Overrideprotected void onDestroy() {super.onDestroy();unregisterReceiver(receiver);}class NetworkChangeReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(MainActivity.this, "network changes", Toast.LENGTH_SHORT).show();}} }效果圖:
Toast提示有點麻煩,下面我們換做TextView來顯示文字,同時判斷網絡是否可用。
activity_main.xml代碼:
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:id="@+id/tv_show"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!"android:textColor="@android:color/holo_orange_light"android:textSize="20sp"android:textStyle="bold"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /></android.support.constraint.ConstraintLayout>MainActivity.java代碼:
package com.example.administrator.broadcasttest;import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.media.ExifInterface; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; import android.widget.Toast;import org.w3c.dom.Text;public class MainActivity extends AppCompatActivity {private NetworkChangeReceiver receiver;private IntentFilter intentFilter;private TextView tv_show;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);receiver = new NetworkChangeReceiver();intentFilter = new IntentFilter();//添加監聽網絡發生變化的Action,這是動態注冊廣播的常用方式,靜態注冊一般在AndroidManifest中添加<action/>標簽intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");registerReceiver(receiver, intentFilter);tv_show = (TextView) findViewById(R.id.tv_show);}@Overrideprotected void onDestroy() {super.onDestroy();unregisterReceiver(receiver);}class NetworkChangeReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();if (networkInfo != null && networkInfo.isAvailable()) {updateUI("network is available");} else {updateUI("network is unavailable");}}}private void updateUI(final String msg) {runOnUiThread(new Runnable() {@Overridepublic void run() {tv_show.setText(msg);}});} }因為要判斷網絡是否可用,所以需要在AndroidManifest中需要加上監聽網絡是否可用的權限:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.administrator.broadcasttest"><!--監聽網絡狀態的權限--><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>注意、注意,現在的Android手機對于權限方面的控制很嚴格了,可能你在程序中已經加上了,然而手機真機中沒有允許給予權限,網絡狀態的監聽還是無法使用。
最后運行程序,實現效果圖如下:
點擊數據流量:
?
?
總結
以上是生活随笔為你收集整理的初识广播机制(监听网络状态的改变,监听网络是否可以使用)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 13薪要满一年才发吗 没有干满一年能不能
- 下一篇: 广播,实现强制下线功能(项目文件已上传G