Android移動開發檢測網路狀態並使用BroadcastReceiver(廣播接收者)進行接收網路變化的後續處理
在Android開發中,許多功能需要網路連線,所以在開發過程中需要進行手機網路的檢測。而每做一個App,就要進行檢測,那麼我直接將檢測網路狀態的功能封裝成一個類。
檢測網路狀態所需要的Api:
- ConnectivityManager主要用於檢視網路狀態和管理網路連線相關的操作
- NetworkInfo物件包含網路連線的所有資訊
實現網路狀態檢測功能,首先獲得ConnectivityManager物件,再獲取ConnectivityManager物件對應的NetworkInfo物件,並根據需要從NetworkInfo物件取出關於網路連線的資訊,進行後續處理。
注意:Api23及以上時,getNetworkInfo(int networkType)方法已被棄用,取而代之的是:
getAllNetworks();
getNetworkInfo(android.net.Network);
getNetworkInfo(Network network);
所以我們檢測網路狀態時需要分版本進行檢測。
我們使用Android的四大元件之一的BroadcastReceiver(廣播接收者)進行接收網路變化的後續處理。
上程式碼。
實現監聽網路狀態變更的廣播接收器——NetBroadcastReceiver.java
import android. content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import com.maigu.yang.networkinit.bean.NetworkChangeEvent;
import com.maigu.yang.networkinit.utils.NetUtils;
import org.greenrobot.eventbus.EventBus;
public class NetBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//**判斷當前的網路連線狀態是否可用*/
boolean isConnected = NetUtils.isConnected(context);
EventBus.getDefault().post(new NetworkChangeEvent(isConnected));
}
}
我們使用廣播接收器接收網路變化的 Intent,這裡直接使用靜態註冊的方法,因為我們不需要在每個頁面單獨註冊這個 Receiver,那太重量級了。
在AndroidManifest.xml進行廣播的靜態註冊,以及網路許可權
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.maigu.yang.networkinit">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<application
android: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"
tools:ignore="AllowBackup,GoogleAppIndexingWarning">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver
android:name=".broadcast.NetBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action
android:name="android.net.conn.CONNECTIVITY_CHANGE"
tools:ignore="BatteryLife" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
</application>
</manifest>
然後是監聽網路狀態的NetUtils.java工具類
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkInfo;
import android.util.Log;
import android.widget.Toast;
/**
* 作者 yunyang
* 時間 2018/11/7 13:14
* 檔案 NetWorkInit
* 描述 網路工具類
*/
public class NetUtils {
/**
* 判斷網路是否連線
*
* @param context
* @return 網路是否連線Boolean(true|false)
*/
@SuppressWarnings({"ConstantConditions", "ForLoopReplaceableByForEach", "IfCanBeSwitch"})
public static boolean isConnected(Context context) {
StringBuilder sb = null;
//檢測API是不是小於21,因為到了API21之後getNetworkInfo(int networkType)方法被棄用
/**
* 在系統版本小於21之前,使用以下的方式獲取當前網路狀態:
* 先利用Context物件獲取ConnectivityManager物件,
* 然後利用ConnectivityManager物件獲取NetworkInfo物件,
* 然後根據NetworkInfo物件的型別來返回不同的網路狀態。
* 有三種,移動,Wi-Fi,無網路連線。
*/
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.LOLLIPOP) {
//獲得ConnectivityManager物件
ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
//獲取ConnectivityManager物件對應的NetworkInfo物件
//獲取WIFI連線的資訊
NetworkInfo wifiNetworkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
//獲取移動資料連線的資訊
NetworkInfo dataNetworkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (wifiNetworkInfo.isConnected() && dataNetworkInfo.isConnected()) {
Toast.makeText(context, "WIFI已連線,移動資料已連線", Toast.LENGTH_SHORT).show();
Log.e("yunyang", "WIFI已連線,移動資料已連線");
return true;
} else if (wifiNetworkInfo.isConnected() && !dataNetworkInfo.isConnected()) {
Toast.makeText(context, "WIFI已連線,移動資料已斷開", Toast.LENGTH_SHORT).show();
Log.e("yunyang", "WIFI已連線,移動資料已斷開");
return true;
} else if (!wifiNetworkInfo.isConnected() && dataNetworkInfo.isConnected()) {
Toast.makeText(context, "WIFI已斷開,移動資料已連線", Toast.LENGTH_SHORT).show();
Log.e("yunyang", "WIFI已斷開,移動資料已連線");
return true;
} else {
Toast.makeText(context, "WIFI已斷開,移動資料已斷開", Toast.LENGTH_SHORT).show();
Log.e("yunyang", "WIFI已斷開,移動資料已斷開");
return false;
}
} else {
/**
* 在系統21及之後,獲取網路連線狀態的方式:利用ConnectivityManager物件獲取
* 所有的網路連線資訊,然後遍歷每個網路連線,獲取相應的NetworkInfo,
* 然後根據NetworkInfo物件的型別來返回不同的網路狀態。
*/
if (sb != null) {
sb.setLength(0);
}
//獲得ConnectivityManager物件
ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
//獲取所有網路連線的資訊
Network[] networks = connMgr.getAllNetworks();
//用於存放網路連線資訊
sb = new StringBuilder();
//通過迴圈將網路資訊逐個取出來
for (int i = 0; i < networks.length; i++) {
//獲取ConnectivityManager物件對應的NetworkInfo物件
NetworkInfo networkInfo = connMgr.getNetworkInfo(networks[i]);
sb.append(networkInfo.getTypeName() + " connect is " + networkInfo.isConnected());
}
Log.e("yunyang", "sb.toString() : " + sb.toString());
if (sb.toString().equals("WIFI connect is true")) {
Toast.makeText(context, "WIFI已連線", Toast.LENGTH_SHORT).show();
Log.e("yunyang", "WIFI已連線");
return true;
} else if (sb.toString().equals("MOBILE connect is true")) {
Toast.makeText(context, "移動資料已連線", Toast.LENGTH_SHORT).show();
Log.e("yunyang", "移動資料已連線");
return true;
} else if (sb.toString().equals("MOBILE connect is trueWIFI connect is true")
|| sb.toString().equals("WIFI connect is trueMOBILE connect is true")) {
Toast.makeText(context, "WIFI已連線,移動資料已連線", Toast.LENGTH_SHORT).show();
Log.e("yunyang", "WIFI已連線,移動資料已連線");
return true;
} else if (sb.toString().equals("MOBILE connect is falseWIFI connect is true")
|| sb.toString().equals("WIFI connect is trueMOBILE connect is false")) {
Toast.makeText(context, "WIFI已連線,移動資料已斷開", Toast.LENGTH_SHORT).show();
Log.e("yunyang", "WIFI已連線,移動資料已斷開");
return true;
} else if (sb.toString().equals("MOBILE connect is trueWIFI connect is false")
|| sb.toString().equals("WIFI connect is falseMOBILE connect is true")) {
Toast.makeText(context, "WIFI已斷開,移動資料已連線", Toast.LENGTH_SHORT).show();
Log.e("yunyang", "WIFI已斷開,移動資料已連線");
return true;
} else {
Toast.makeText(context, "WIFI已斷開,移動資料已斷開", Toast.LENGTH_SHORT).show();
Log.e("yunyang", "WIFI已斷開,移動資料已斷開");
return false;
}
}
}
}
我們希望當用戶網路連線不可用時,及時提醒使用者當前的網路狀態。當連線恢復時,將提示用的檢視隱藏,並且我們希望這個提示檢視可以工作在所有需要網路的頁面中。
所以我建立一個基類 BaseActivity ,所有頁面繼承該檔案,在該檔案中實現根據網路狀態顯示提示、隱藏提示。
import android.content.Context;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import com.maigu.yang.networkinit.R;
import com.maigu.yang.networkinit.bean.NetworkChangeEvent;
import com.maigu.yang.networkinit.utils.ActivityCollector;
import com.maigu.yang.networkinit.utils.NetUtils;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
/**
* 作者 yunyang
* 時間 2018/11/7 13:18
* 檔案 NetWorkInit
* 描述 BaseActivity
*/
public class BaseActivity extends AppCompatActivity {
protected Context mContext;
protected boolean mCheckNetWork = true; //預設檢查網路狀態
View mTipView;
WindowManager mWindowManager;
WindowManager.LayoutParams mLayoutParams;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = this;
ActivityCollector.addActivity(this);// 將正在建立的活動新增到活動管理器裡
initTipView();//初始化提示View
EventBus.getDefault().register(this);
}
@Override
protected void onResume() {
super.onResume();
//在無網路情況下開啟APP時,系統不會發送網路狀況變更的Intent,需要自己手動檢查
hasNetWork(NetUtils.isConnected(mContext));
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity(this);// 將活動管理器裡活動移除
EventBus.getDefault().unregister(this);
}
@Override
public void finish() {
super.finish();
//當提示View被動態新增後直接關閉頁面會導致該View記憶體溢位,所以需要在finish時移除
if (mTipView != null && mTipView.getParent() != null) {
mWindowManager.removeView(mTipView);
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onNetworkChangeEvent(NetworkChangeEvent event) {
hasNetWork(event.isConnected);
}
private void hasNetWork(boolean has) {
if (isCheckNetWork()) {
if (has) {
if (mTipView != null && mTipView.getParent() != null) {
mWindowManager.removeView(mTipView);
Log.e("yunyang", "有網路");
}
} else {
if (mTipView.getParent() == null) {
mWindowManager.addView(mTipView, mLayoutParams);
Log.e("yunyang", "無網路");
}
}
}
}
/**
* 預設所有繼承 BaseActivity 的頁面當網路狀況變化活無網路時都會顯示提示,
* 如果某個頁面不需要網路狀態提示,可以在該頁面 onCreate
* 方法中呼叫 setCheckNetWork(false) 即可。
*
* @param checkNetWork
*/
public void setCheckNetWork(boolean checkNetWork) {
mCheckNetWork = checkNetWork;
}
public boolean isCheckNetWork() {
return mCheckNetWork;
}
private void initTipView() {
LayoutInflater inflater = getLayoutInflater();
mTipView = inflater.inflate(R.layout.layout_network_tip, null); //提示View佈局
mWindowManager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
mLayoutParams = new WindowManager.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_APPLICATION,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
PixelFormat.TRANSLUCENT);
//使用非CENTER時,可以通過設定XY的值來改變View的位置
mLayoutParams.gravity = Gravity.TOP;
mLayoutParams.x = 0;
mLayoutParams.y = 180;
// mLayoutParams.gravity = Gravity.CENTER;
}
}
BaseActivity中使用網路狀態提示檢視的佈局layout_network_tip.java
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width
相關推薦
Android移動開發檢測網路狀態並使用BroadcastReceiver(廣播接收者)進行接收網路變化的後續處理
在Android開發中,許多功能需要網路連線,所以在開發過程中需要進行手機網路的檢測。而每做一個App,就要進行檢測,那麼我直接將檢測網路狀態的功能封裝成一個類。
檢測網路狀態所需要的Api:
ConnectivityManager主要用於檢視網路狀態和管理網路連線相關的
Android學習——BroadcastReceiver(廣播接收者)
BroadcastReceiver
定義
中文意思“廣播接收者”,是一個全域性的監聽器,屬於Android四大元件之一。
使用場景
同一個App內部的同一組件內的訊息通訊(單個或者多個執行緒之間);
平安科技移動開發二隊技術周報(第三期)
editor 跨平臺 1.0 weekly master -s 沒有 理解 dos
平安科技移動開發二隊技術周報(第三期)
業界新聞
1)關於AFNetworking 安全bug的回復
AFNetworking代碼維護者對文章 utm_sour
解決在BroadcastReceiver(廣播接受者)中不能新增AlertDialog(對話方塊)的問題(android.view.WindowManager$BadTokenException)
在BroadcastReceiver,當我們建立一個AlertDialog並show出來的時候,出現了下面的錯誤:
12-24 14:10:57.025: E/AndroidRuntime(17600): java.lang.RuntimeException: Unable
caffe之網路權重視覺化(C++實現),分析網路功能 caffe之網路權重視覺化(C++實現)
原
caffe之網路權重視覺化(C++實現)
2017年05月05日 11:28:12
真小假
閱讀數:3083
&
Android移動開發-藍芽(BlueTooth)裝置檢測連線的實現
無論是WIFI還是4G網路,建立網路連線後都是訪問網際網路資源,並不能直接訪問區域網資源。比如兩個人在一起,A要把手機上的視訊傳給B,通常情況是開啟手機QQ,通過QQ傳送檔案給對方。不過上傳視訊很耗流量,如果現場沒有可用的WIFI,手機的資料流量又不足,那
Android移動開發-多人線上測評記錄考生狀態例項
一個測評軟體,可以多個老師同時線上使用,怎樣控制各個老師不能同時對同一個學生進行考試呢?
1、服務端儲存正在考試的考生標識;
2、當某個老師選取了一些學生進行考試的時候,首先去服務端獲取這些考生哪些已經在考試了,然後與選取的考生相減,等到
還未考試的學生;3、當這個老師不對
Android監控WIFI和GSM狀態並繪製網路強度
在實際工作中,常常遇到APP顯示網路強度的需求。
使用過程中涉及的應用許可權如下:
<!--wifi及網路狀態-->
<uses-permission android:name="android.permission.ACCESS_WIF
做android移動開發的一點體會
協作開發 自動化 成了 省電 概率 很多 sim卡 體會 message 做手機的一點體會
整個android系統是一個完整的生態系統,谷歌提供開放的android平臺,下遊有各種生產硬件的廠家提供各種手機的硬件,像富士康這樣的工廠提供手機的代加工,
然後是高通這樣的公司提
使用shell檢測raid狀態並制作表格發送到郵箱
shell 發送表格到郵箱cat raid_fzt.sh
#!/bin/bash
#data:2018.3.9
#check raid status and mail to someone
DIR="/home/s/ops/pantheon/argos/raid.check" # 腳本所
輪詢檢測Apache狀態並啟用釘釘報警
F5 head seq spa true 服務 api then ans
#!/bin/bash
shell_user="root"
shell_domain="apache"
shell_list="/root/ip_list"
shell_row=`
BroadcastReceiver(廣播)的靜態註冊和動態註冊 --Android開發
encoding save private tac app tco sta content con BroadcastReceiver是安卓四大組件之一,本例通過代碼的方式演示靜態註冊和動態註冊。
1、靜態註冊
靜態註冊只需要AndroidManifest.xml中進行
Android移動開發01----用Android Studio進行開發
一直以來都用Eclipse進行開發,但是最近發現Eclipse執行越來越緩慢,再加上自己的電腦已入暮年,時不時卡頓一下實在讓人受不了。在開發Ruby的時候接觸了RubyMine,一個基於IntelliJ IDEA的IDE,功能強大,速度比較快。於是決定拋棄Ecl
android studio開發 匯出Jar包並在unity3d中使用
【匯出JAR包】
首先模組專案只能是library,而不能是application。如果除了打包程式碼還有資源的話,需要打包成aar包。
1、在app目錄下的 build.gradle檔案中 添下程式碼:
apply plugin: 'com.android.lib
Android移動開發中通用技術整理
悲劇的住院了,閒來無聊。整理下以前做的幾個專案的寫下的筆記。
因為專案的通用性,以前老大給的建議是能做成類似於封裝完的jar包。
因為沒什麼時間,還有老大太高估我了 = =。
在此只是列一下幾個通用技術
通用技術一:App進入後的網路檢測。
程式碼很簡單
import a
Android移動開發-檢測點選按鍵事件的實現
檢測點選按鍵事件一般不對手機上的輸入按鍵進行處理,直接由系統按照預設情況操作。當然有時為了改善使用者體驗,需要讓應用攔截按鍵事件,並進行額外處理。
要想監控按鍵事件,首先得知道每個按鍵的編碼,這樣才能根據不同的編碼值進行相應的處理。監聽器OnKeyL
Android移動開發-使用URLConnection提交請求的實現
URL的openConnection()方法將返回一個URLConnection物件,該物件表示應用程式和URL之間的通訊連線。程式可以通過URLConnection例項向該URL傳送請求,讀取URL引用的資源。
通常建立一個和URL的連線,併發
Android移動開發 實現按鈕機制的三種方法
Android開發中有三種主要的方式用於設定View的點選事件,1、建立內部類;2、主類中實現OnClickListener介面;3、使用匿名內部類。這三種方式都用到了OnClickListener介面,只是不同形式而已。其中OnClickListener是監
Android移動開發-使用OpenGL來繪製3D紋理圖的實現
OpenGL(全寫Open Graphics Library)是指定義了一個跨程式語言、跨平臺的程式設計介面規格的專業的圖形程式介面。它用於三維影象(二維的亦可),是一個功能強大,呼叫方便的底層圖形庫。
OpenGL是行業領域中最為廣泛接納的 2D/
Android移動開發-使用VideoView播放視訊的實現
為了在Android應用中播放視訊,Android提供了VideoView控制元件,它就是一個位於android.widget包下的控制元件,它的作用與ImageView類似,只是ImageVie