android監聽網路變化
❶ android 資料庫怎麼監聽數據變化
在android中經常會用到改變資料庫內容後再去使用資料庫更新的內容,很多人會重新去query一遍,但是這樣的問題就是程序會特別占內存,而且有可能會摟關cursor而導致程序內存未釋放等等。其實android內部提供了一種ContentObserver的東西來監聽資料庫內容的變化。
ContentObserver的構造函數需要一個參數Hanlder,因為ContentObserver內部使用了一個實現Runnable介面的內部類NotificationRunnable,來實現資料庫內容的變化。需要使用hanlder去post消息。注冊ContentObserver的方法是:getContentResolver().registerContentObserver(uri, notifyForDescendents, observer).
上面3個參數為:uri----Uri類型,是需要監聽的資料庫的uri.
notifyForDescendents---boolean true的話就會監聽所有與此uri相關的uri。false的話則是直接特殊的uri才會監聽。一般都設置為true.
observer-----ContentObserver 就是需要的contentobserver.
初始化一個ContentObserver對象,重載onChange(boolean ),在這個方法里去操作資料庫的使用,針對變化後的使用。
❷ Android 超簡單實現網路狀態的監聽
我們做項目的時候,不可避免的要做網路狀態的監聽,一般我們都是抽取出一個工具類來實現,比如:
細致的你當然還會再寫一個判斷網路類型的方法,反手再來一個例:
然後就可以在相應的操作前進行判斷網路的判斷:
但是這樣做也有些問題:
接下來就是本文的重點,如何通過 NetStatusBus 這個庫來解決以上問題,讓你的網路狀態監聽變得前所未有的簡單粗暴。
到這里就已經結束了,你的所有網路操作已經都可以清晰優雅的在訂閱方法中進行處理了,當然你也可以繼續往下看。
訂閱方法必須填寫一個NetType參數,可以通過NetType的值來判斷當前網路類型。
@NetSubscribe中 netType為可選值,可以設置訂閱的類型,可選值類型如下:
NetType.AUTO
這是默認值,任何網路狀態發生變化,該類型訂閱者都會被回調。同時會傳入NetType參數告知你當前的網路類型,示例如下:
只要當前是由 WIFI 改變引發的網路狀態變化,該類型訂閱者都會被回調。同時會傳入NetType參數告知你當前的網路類型,示例如下:
只要當前是由移動網路改變引發的網路狀態變化,該類型訂閱者都會被回調。同時會傳入NetType參數告知你當前的網路類型,示例如下:
NetType.NONE
只有當網路丟失時,該類型訂閱者才會被回調。
有人會覺得,我用個庫爽就行了管它的原理干什麼?
你放心,我只是小小的描述一下實現方式。
原理簡單來說,就是在全局初始化的時候就綁定對網路的變化監聽。然後將進行注冊的父類所有的訂閱方法保存至集合中,這里涉及到一些方法的校驗,最後在網路狀態發生改變時利用 java 反射機制遍歷執行所有訂閱方法。熟悉 EventBus 的小夥伴已經看出來了這里借鑒了一小部分 EventBus 的思想。
回到第一步,那麼具體是如何綁定對網路狀態變化的監聽呢?
以前我們是通過注冊廣播來實現綁定網路變更的監聽,在Android 7.0 以後,Google 基於性能和安全原因對廣播進行了很多限制,比如監聽網路變更的廣播 android.net.conn.CONNECTIVITY_CHANGE 使用靜態注冊的方式則無法生效,而動態注冊的方式雖然可以生效但畢竟不是最優解。
同樣出於性能和安全,以及擁抱變化的角度,最終我們還是使用官方推薦的方式,利用 ConnectivityManager.NetworkCallback 來進行網路變化的監聽,這是在Android 5.0即android api 21推出的API,目前Android 5.0以上的市場佔有率在 85%以上,隨著國內各大廠商正在積極的推進適配普及Android Q,這個比例還會進一步增大,所以個人人認為無需過於擔心低版本適配。
使用的時候出現這個問題是由於少添加了許可權。
Caused by: java.lang.SecurityException: ConnectivityService: Neither user 10513 nor current process has android.permission.ACCESS_NETWORK_STATE.
java.lang.RuntimeException: Unable to create application com.jiyun.wanandroid.WanApplication: java.lang.SecurityException: ConnectivityService: Neither user 10513 nor current process has android.permission.ACCESS_NETWORK_STATE.
加上這幾個許可權就好了:
附上原文地址: https://www.jianshu.com/p/2fea980b3e56
❸ android中如何監聽到其他應用的網路請求數據
目前android提供的工具沒事,我們寫工程都是自己寫http請求,每次請求的時候打Log,記錄請求的url和參數。請求回來了,打log,記錄回來的數據,記錄數據的狀態,數據的內容。 目前只能這樣。如果用模擬器的話,可以用vnStat或者CommView之類的監控電腦網卡的請求,間接的監控手機。一般開發用手機測試,這樣就不行了。只能打log了
❹ android 判斷是否有網路連接
ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = connectivity.getActiveNetworkInfo();
if(info != null && info.isAvailable()){
if (netInfo.getType() == ConnectivityManager.TYPE_WIFI) {
//WiFi網路
} else if (netInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
//移動網路
} else {
//網路錯誤
}
}else{
//網路錯誤
}
❺ Android網路狀態判斷與處理
在項目的開發過程中 , 我們的應用程序都是在有網路的情況下進行處理的 , 但我們也要考慮到在沒有網路的情況下,應用會出現什麼樣的情況 , 所以我們需要獲取到當前的網路信息.
獲取網路信息需要在AndroidManifest.xml文件中加入相應的許可權。
1)判斷是否有網路連接
2)判斷WIFI網路是否可用
3)判斷MOBILE網路是否可用
4)獲取當前網路連接的類型信息
在開發android應用時,涉及到要進行網路訪問,時常需要進行網路狀態的檢查,以提供給用戶必要的提醒。一般可以通過ConnectivityManager來完成該工作。
當我們要在程序中監聽網路狀態時,只要一下幾個步驟即可:
1、定義一個Receiver重載其中的onReceive函數,在其中完成所需要的功能,如根據WIFI和GPRS是否斷開來改變空間的外觀
2、在適當的地方注冊Receiver,可以在程序中注冊,在onCreate中調用如下函數即可:
3、在適當時取消注冊Receiver,可以在程序中取消,在onDestroye中調用如下函數即可:
很多朋友在android開發中,都會遇到手機網路類型判斷,因為就目前的android平台手機來說:可能會存在4種狀態:
這四種狀態,如果沒有網路,肯定是無法請求Internet了,如果是wap就需要為手機添加中國移動代理.
下面是網路判斷的方法:
因為獲取的是服務對象,所以這個網路狀態都是時時刷新的,所以我們只需要得到網路狀態就可以了!
最後總結:
工具類:
BaseActivity:
MainActivity
Log日誌
❻ android wifi切換路由器怎麼監聽
第一步:手機的設置:下載超級終端Better Terminal。各大市場應該大把大把的,我是在豌豆莢上下載的。下載完後在手機安裝上,點擊進入,其中有個選項是開啟gui還是shell,對於我們android開發者來說當然是選擇比較牛逼的shell了。進入後輸入如下內容:
setprop service.adb.tcp.port 5555
stop adbd
start adbd
這樣你的手機就配置好了tcpip的網路調試埠了。
第二步:電腦的配置:將手機通過usb連接到電腦上,cmd到你的androidsdk的目錄下的platform-tools目錄執行:
adb tcpip 5555
將機器上的adb切換為網路模式,後面5555是埠號,當然你也可以寫其他埠號,只要你的手機的這個埠號沒有被使用就可以了.
第三步:電腦配置:運行cmd,輸入
adb connect <你手機IP>:5555
例如:adb connect 10.7.10.3:5555 ,其中10.7.10.3是我的手機的ip地址你輸入你的手機的ip地址即可。
如果成功的話,會提示 connected to 10.7.10.3:5555
現在你的電腦就可以通過wifi連接電腦調試了,當然你通過eclipse進行調試也是沒問題的。
第四步:當你使用完wifi調試的時候,請連接手機後cmd輸入adb usb,切換回usb調試。
❼ android wifi正在連接的狀態廣播
很多時候我們都需要實時監聽網路狀態,當網路狀態發生變化之後立即通知程序進行不同的操作。
監聽廣播的兩種方式:
(1)在AndroidManifest.xml配置文件中聲明
<receiver android:name=".NetworkConnectChangedReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
<action android:name="android.net.wifi.STATE_CHANGE" />
</intent-filter>
</receiver>1234567
(2)在代碼中注冊
IntentFilter filter = new IntentFilter(); filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(new NetworkConnectChangedReceiver(), filter);12345
接下來創建實時監聽網路連接與斷開狀態變化的BroadcastReceiver對象,我們需要繼承android.content.BroadcastReceiver,並實現其onReceive方法,下面我們就創建一個名為NetworkConnectChangedReceiver廣播接收者,看一下具體的實現代碼,由於代碼寫得很詳細,就不一一解釋了
package com.per.networkconnectdome;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.net.ConnectivityManager;import android.net.NetworkInfo;import android.net.wifi.WifiManager;import android.os.Parcelable;import android.util.Log;public class NetworkConnectChangedReceiver extends BroadcastReceiver {
private String getConnectionType(int type) {
String connType = ""; if (type == ConnectivityManager.TYPE_MOBILE) {
connType = "3G網路數據";
} else if (type == ConnectivityManager.TYPE_WIFI) {
connType = "WIFI網路";
} return connType;
} @Override
public void onReceive(Context context, Intent intent) { if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction())) {// 監聽wifi的打開與關閉,與wifi的連接無關
int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0);
Log.e("TAG", "wifiState:" + wifiState); switch (wifiState) { case WifiManager.WIFI_STATE_DISABLED: break; case WifiManager.WIFI_STATE_DISABLING: break;
}
} // 監聽wifi的連接狀態即是否連上了一個有效無線路由
if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(intent.getAction())) {
Parcelable parcelableExtra = intent
.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); if (null != parcelableExtra) { // 獲取聯網狀態的NetWorkInfo對象
NetworkInfo networkInfo = (NetworkInfo) parcelableExtra; //獲取的State對象則代表著連接成功與否等狀態
NetworkInfo.State state = networkInfo.getState(); //判斷網路是否已經連接
boolean isConnected = state == NetworkInfo.State.CONNECTED;
Log.e("TAG", "isConnected:" + isConnected); if (isConnected) {
} else {
}
}
} // 監聽網路連接,包括wifi和移動數據的打開和關閉,以及連接上可用的連接都會接到監聽
if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) { //獲取聯網狀態的NetworkInfo對象
NetworkInfo info = intent
.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); if (info != null) { //如果當前的網路連接成功並且網路連接可用
if (NetworkInfo.State.CONNECTED == info.getState() && info.isAvailable()) { if (info.getType() == ConnectivityManager.TYPE_WIFI
|| info.getType() == ConnectivityManager.TYPE_MOBILE) {
Log.i("TAG", getConnectionType(info.getType()) + "連上");
}
} else {
Log.i("TAG", getConnectionType(info.getType()) + "斷開");
}
}
}
}
}
在onReceive方法裡面,我們可以獲取從廣播而來的Intent中的數據,這包含很多有用的信息,其中
ConnectivityManager : 主要管理和網路連接相關的操作
WifiManager: 管理和wifi相關的信息
TelephonyManager: 管理和手機、運營商等的相關信息
NetworkInfo類包含了對wifi和mobile兩種網路模式連接的詳細描述,通過getState()方法獲取的State對象,代表著連接成功與否的狀態。
最後記得添加許可權:
<uses-permission android:name="android.permission.access_wifi_state" /><uses-permission android:name="android.permission.access_network_state" />
❽ Android使用廣播監聽網路狀態變化 一直收到系統廣播
因為這個系統廣播在不停的發送,系統網路狀態在不停的變化。比如關閉,打開,掃描,正在連接,已連接等狀態。