[英]How to check internet connectivity continuously in background while android application running
我想在我的 android 應用程序運行時在后台連續檢查互聯網連接。 我的意思是從申請開始到申請結束。 我該怎么做? 應該采取什么方法?
我知道我回答這個問題遲到了。 但這里有一種在活動/片段中連續監視網絡連接的方法。
我們將使用網絡回調來監視活動/片段中的連接
首先,在類中聲明兩個變量
// to check if we are connected to Network
boolean isConnected = true;
// to check if we are monitoring Network
private boolean monitoringConnectivity = false;
接下來,我們將編寫網絡回調方法
private ConnectivityManager.NetworkCallback connectivityCallback
= new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
isConnected = true;
LogUtility.LOGD(TAG, "INTERNET CONNECTED");
}
@Override
public void onLost(Network network) {
isConnected = false;
LogUtility.LOGD(TAG, "INTERNET LOST");
}
};
現在既然我們已經編寫了我們的回調,我們現在將編寫一個方法來監控我們的網絡連接,在這個方法中,我們將注冊我們的 NetworkCallback。
// Method to check network connectivity in Main Activity
private void checkConnectivity() {
// here we are getting the connectivity service from connectivity manager
final ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(
Context.CONNECTIVITY_SERVICE);
// Getting network Info
// give Network Access Permission in Manifest
final NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
// isConnected is a boolean variable
// here we check if network is connected or is getting connected
isConnected = activeNetworkInfo != null && activeNetworkInfo.isConnectedOrConnecting();
if (!isConnected) {
// SHOW ANY ACTION YOU WANT TO SHOW
// WHEN WE ARE NOT CONNECTED TO INTERNET/NETWORK
LogUtility.LOGD(TAG, " NO NETWORK!");
// if Network is not connected we will register a network callback to monitor network
connectivityManager.registerNetworkCallback(
new NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.build(), connectivityCallback);
monitoringConnectivity = true;
}
}
我們所有的工作都快完成了,我們只需要調用我們的 Activity/Fragment 的 onResume() 中的方法 checkConnectivity()
@Override
protected void onResume() {
super.onResume();
checkConnectivity();
}
*在 onPause() 中取消注冊 NetworkCallback,您的活動/片段的方法 *
@Override
protected void onPause() {
// if network is being moniterd then we will unregister the network callback
if (monitoringConnectivity) {
final ConnectivityManager connectivityManager
= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
connectivityManager.unregisterNetworkCallback(connectivityCallback);
monitoringConnectivity = false;
}
super.onPause();
}
就是這樣,只需添加此代碼,其中您需要監視網絡的活動/片段的每個類!。不要忘記取消注冊!!!
創建擴展BroadcastReceiver
類,使用ConnectivityManager.EXTRA_NO_CONNECTIVITY
獲取連接信息。
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.widget.Toast;
public class CheckConnectivity extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent arg1) {
boolean isConnected = arg1.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
if(isConnected){
Toast.makeText(context, "Internet Connection Lost", Toast.LENGTH_LONG).show();
}
else{
Toast.makeText(context, "Internet Connected", Toast.LENGTH_LONG).show();
}
}
}
在 mainfest 中也添加此權限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
要檢查互聯網連接,只需為CONNECTIVITY_CHANGE和WIFI_STATE_CHANGED注冊廣播。 因此,每當互聯網連接或斷開連接事件發生時,我們的 BroadcastReceiver 的 onReceive 方法就會被調用,我們可以在其中編寫我們的邏輯。
在 AndroidManifest.xml 中
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<receiver
android:name="NetworkChangeReceiver"
android:label="NetworkChangeReceiver" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
</intent-filter>
</receiver>
在 NetworkChangeReceiver 類中。
public class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
int status = NetworkUtil.getConnectivityStatusString(context);
if ("android.net.conn.CONNECTIVITY_CHANGE".equals(intent.getAction())) {
if (status == NetworkUtil.NETWORK_STATUS_NOT_CONNECTED) {
//write code for internet is disconnected...
} else {
//write code for internet is connected...
}
}
}
}
檢查互聯網的狀態。
public class NetworkUtil {
public static final int TYPE_NOT_CONNECTED = 0;
public static final int TYPE_WIFI = 1;
public static final int TYPE_MOBILE = 2;
public static final int NETWORK_STATUS_NOT_CONNECTED = 3;
public static final int NETWORK_STATUS_WIFI = 4;
public static final int NETWORK_STATUS_MOBILE = 5;
public static int getConnectivityStatus(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
if (null != activeNetwork) {
if(activeNetwork.getType() == ConnectivityManager.TYPE_WIFI)
return TYPE_WIFI;
if(activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE)
return TYPE_MOBILE;
}
return TYPE_NOT_CONNECTED;
}
public static int getConnectivityStatusString(Context context) {
int conn = NetworkUtil.getConnectivityStatus(context);
int status = 0;
if (conn == NetworkUtil.TYPE_WIFI) {
status = NETWORK_STATUS_WIFI;
} else if (conn == NetworkUtil.TYPE_MOBILE) {
status = NETWORK_STATUS_MOBILE;
} else if (conn == NetworkUtil.TYPE_NOT_CONNECTED) {
status = NETWORK_STATUS_NOT_CONNECTED;
}
return status;
}
}
在活動或片段中
public static final String BROADCAST = "checkinternet";
IntentFilter intentFilter;
在 oncreate 里面
intentFilter = new IntentFilter();
intentFilter.addAction(BROADCAST);
Intent serviceIntent = new Intent(this,Networkservice.class);
startService(serviceIntent);
if (Networkservice.isOnline(getApplicationContext())){
Toast.makeText(getApplicationContext(),"true",Toast.LENGTH_SHORT).show();
}else
Toast.makeText(getApplicationContext(),"false",Toast.LENGTH_SHORT).show();
外面 oncreate
public BroadcastReceiver broadcastReceiver=new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(BROADCAST)){
if (intent.getStringExtra("online_status").equals("true")){
Toast.makeText(getApplicationContext(),"true",Toast.LENGTH_SHORT).show();
Log.d("data","true");
}else {
Toast.makeText(getApplicationContext(), "false", Toast.LENGTH_SHORT).show();
Log.d("data", "false");
}
}
}
};
@Override
protected void onRestart() {
super.onRestart();
registerReceiver(broadcastReceiver,intentFilter);
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(broadcastReceiver);
}
@Override
protected void onResume() {
super.onResume();
registerReceiver(broadcastReceiver,intentFilter);
}
//班級
public class Networkservice extends Service {
@Override
public void onCreate() {
super.onCreate();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
handler.post(perioud);
return START_STICKY;
}
public static boolean isOnline(Context context){
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo nf=cm.getActiveNetworkInfo();
if (nf!=null&&nf.isConnectedOrConnecting())
return true;
else
return false;
}
Handler handler=new Handler();
private Runnable perioud =new Runnable() {
@Override
public void run() {
handler.postDelayed(perioud,1*1000- SystemClock.elapsedRealtime()%1000);
Intent intent = new Intent();
intent.setAction(MainActivity.BROADCAST);
intent.putExtra("online_status",""+isOnline(Networkservice.this));
sendBroadcast(intent);
}
};
}
ConnectivityObserver.kt:
package com.example.checkInternet
import kotlinx.coroutines.flow.Flow
interface ConnectivityObserver {
fun observe(): Flow<Status>
enum class Status {
Available, Unavailable, Losing, Lost
}
}
NetworkConnectivityObserver.kt:
package com.example.checkInternet
import android.content.Context
import android.net.*
import android.os.Build
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.callbackFlow
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.launch
@OptIn(ExperimentalCoroutinesApi::class)
class NetworkConnectivityObserver(
context: Context,
): ConnectivityObserver {
private val connectivityManager =
context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
private val networkRequest = NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.build()
override fun observe(): Flow<ConnectivityObserver.Status> {
return callbackFlow {
val callback = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
super.onAvailable(network)
launch { send(ConnectivityObserver.Status.Available) }
}
override fun onLosing(network: Network, maxMsToLive: Int) {
super.onLosing(network, maxMsToLive)
launch { send(ConnectivityObserver.Status.Losing) }
}
override fun onLost(network: Network) {
super.onLost(network)
launch { send(ConnectivityObserver.Status.Lost) }
}
override fun onUnavailable() {
super.onUnavailable()
launch { send(ConnectivityObserver.Status.Unavailable) }
}
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
connectivityManager.registerDefaultNetworkCallback(callback)
}else{
connectivityManager.registerNetworkCallback(networkRequest, callback)
}
awaitClose {
connectivityManager.unregisterNetworkCallback(callback)
}
}.distinctUntilChanged()
}
}
MainActivity.kt
package com.example.checkInternet
import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import com.example.checkInternet.ConnectivityObserver
import com.example.checkInternet.NetworkConnectivityObserver
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.launch
class MainActivity : AppCompatActivity() {
private val connectivityObserver : NetworkConnectivityObserver by lazy {
NetworkConnectivityObserver(this)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView( R.layout.activity_main)
lifecycleScope.launch {
connectivityObserver.observe().collect {
when (it) {
ConnectivityObserver.Status.Available -> {
Toast.makeText(this@MainActivity,"Network Available",Toast.LENGTH_LONG).show()
}
ConnectivityObserver.Status.Unavailable -> {
Toast.makeText(this@MainActivity,"Network Unavailable",Toast.LENGTH_LONG).show()
}
ConnectivityObserver.Status.Losing -> {
Toast.makeText(this@MainActivity,"Network Losing",Toast.LENGTH_LONG).show()
}
ConnectivityObserver.Status.Lost -> {
Toast.makeText(this@MainActivity,"Network Lost",Toast.LENGTH_LONG).show()
}
}
}
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.