【问题标题】:Android Check Internet connection continuouslyAndroid 不断检查互联网连接
【发布时间】:2017-06-13 10:46:18
【问题描述】:

我想在广播接收器的每个活动中不断检查互联网连接。我已经编写了代码并且它运行良好。但我想在每一项活动中都使用它。如何修改此代码?

public class MainActivity extends Activity {



private static final String LOG_TAG = "CheckNetworkStatus";
 private NetworkChangeReceiver receiver;
 private boolean isConnected = false;
 private TextView networkStatus;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
  receiver = new NetworkChangeReceiver();
  registerReceiver(receiver, filter);

  networkStatus = (TextView) findViewById(R.id.networkStatus);
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.activity_main, menu);
  return true;
 }

 @Override
 protected void onDestroy() {
  Log.v(LOG_TAG, "onDestory");
  super.onDestroy();

  unregisterReceiver(receiver);

 }


 public class NetworkChangeReceiver extends BroadcastReceiver {

  @Override
  public void onReceive(final Context context, final Intent intent) {

   Log.v(LOG_TAG, "Receieved notification about network status");
   isNetworkAvailable(context);

  }


  private boolean isNetworkAvailable(Context context) {
   ConnectivityManager connectivity = (ConnectivityManager) 
     context.getSystemService(Context.CONNECTIVITY_SERVICE);
   if (connectivity != null) {
    NetworkInfo[] info = connectivity.getAllNetworkInfo();
    if (info != null) {
     for (int i = 0; i < info.length; i++) {
      if (info[i].getState() == NetworkInfo.State.CONNECTED) {
       if(!isConnected){
        Log.v(LOG_TAG, "Now you are connected to Internet!");
        networkStatus.setText("Now you are connected to Internet!");
        isConnected = true;
        //do your processing here ---
        //if you need to post any data to the server or get status
        //update from the server
       }
       return true;
      }
     }
    }
   }
   Log.v(LOG_TAG, "You are not connected to Internet!");
   networkStatus.setText("You are not connected to Internet!");
   isConnected = false;
   return false;
  }
 }


}

【问题讨论】:

  • “持续”是什么意思?
  • 像 Facebook,它同时检查互联网连接。当我断开 wifi/移动设备时,它会在小吃栏中显示一条消息(“断开连接”)类似的东西。
  • 这不会经常检查。当某些事情发生变化并做出响应时,它会收到一个事件。

标签: android android-activity android-broadcastreceiver


【解决方案1】:

我想在每个活动中使用它。如何修改此代码?

创建一个扩展AppCompatActivityBaseActivity 类,然后让您的所有Activity 类扩展此BaseActivity 类。将您的代码放入BaseActivity 类中以检查互联网连接。干杯:)

【讨论】:

  • 我想在每个打开的活动中持续检查互联网连接。我不认为这无济于事。
  • @JewelMahmudNimulShamim 问题是您需要将用于检查连接性的代码放入 BaseActivity 中,以便扩展 BaseActivity 的每个活动都具有该代码。这是解决您的问题的好方法
  • 你能给我一个演示吗。我试了5次不知道我哪里出错了。
  • 你已经有了工作代码,那有什么问题呢?只需将这些代码移动到基类中,这里是 BaseActivity,并使所有 Activity 类扩展该 BaseActivity 类。
  • Toast 仅显示活动何时开始/OnCreated(如果互联网连接不可用),但在执行从基本活动扩展的特定活动的任何任务时不显示黑白
【解决方案2】:
  1. 创建一个没有布局的 BaseActivity,该布局扩展到 AppCompatActivity 或 Activity。
  2. 将您应用的所有其他活动(或您需要检查互联网连接的活动)扩展到 BaseActivity。
  3. 现在在 BaseActivity 中使用广播接收器,它会不断检查网络和连接状态。
  4. BaseActivity 的参考代码。 (在我的例子中,当没有检测到连接时,我会显示一个快餐栏。)

公共类 BaseActivity 扩展 AppCompatActivity {

private static final int WIFI_ENABLE_REQUEST = 0x1006;

private BroadcastReceiver mNetworkDetectReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        checkInternetConnection();
    }
};
private AlertDialog mInternetDialog;
private boolean isConnected;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    isConnected = false;
    registerReceiver(mNetworkDetectReceiver, new IntentFilter(android.net.ConnectivityManager.CONNECTIVITY_ACTION));
}

@Override
protected void onDestroy() {

    unregisterReceiver(mNetworkDetectReceiver);
    super.onDestroy();
}

private void checkInternetConnection() {
    ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo ni = manager.getActiveNetworkInfo();


    if (ni != null && ni.getState() == NetworkInfo.State.CONNECTED) {
        isConnected =true;
        showNoConnectionSnackBar("Connected", isConnected, 1500);

    } else {
        isConnected= false;
        showNoConnectionSnackBar("No active Internet connection found.", isConnected,6000);
    }
}

private  void showNoConnectionSnackBar(String message, boolean isConnected, int duration) {
    Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content),
            message, duration);
    View sbView = snackbar.getView();
    TextView textView = (TextView) sbView
            .findViewById(android.support.design.R.id.snackbar_text);
    textView.setTextColor(ContextCompat.getColor(this, android.R.color.white));

    if (isConnected){
        sbView.setBackgroundColor(getResources().getColor(R.color.colorPrimaryDark));

    }else{
        sbView.setBackgroundColor(getResources().getColor(R.color.google_button_color));
        snackbar.setAction("Turn On", new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent internetOptionsIntent = new Intent(android.provider.Settings.ACTION_WIFI_SETTINGS);
                startActivityForResult(internetOptionsIntent, WIFI_ENABLE_REQUEST);
            }
        });
        snackbar.setActionTextColor(getResources().getColor(R.color.colorPrimary));
    }

    snackbar.show();
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == WIFI_ENABLE_REQUEST) {

    } else {

        super.onActivityResult(requestCode, resultCode, data);

    }
}

}

【讨论】:

    【解决方案3】:

    创建服务。在启动器活动中启动服务并将网络检查代码放入该服务。

    公共类 NetworkService 扩展服务 {

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    
        //register receiver here
        // connection check code 
        return START_STICKY;
    }
    
    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
    }
    
    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }
    
    @Override
    public void onDestroy() {
        super.onDestroy();
        // unregister receiver
    
    }
    

    }

    【讨论】:

      【解决方案4】:

      您可以将您的 BroadcastReceiver 放在它自己的类中,然后在您的 Manifest 中声明/注册它。这样,它将共享您的应用程序的生命周期。

      另一个好处是您不必担心注销它,因此您不必担心内存泄漏。

      【讨论】:

      • 如果您的应用面向 Android 7 (API 24) 或更高版本,这将不起作用。如果目标 API >= 24,获取这些事件的唯一可靠方法是以编程方式注册接收器。
      • 您能解释一下原因吗?或者提供一些来源?
      • developer.android.com/reference/android/net/… 从 Android 7 开始,CONNECTIVITY_ACTION 不再传送给具有清单条目的接收器。这是因为所有应用程序都在注册此事件,并且在连接更改时通知所有应用程序成本太高。从 API 24 开始,Android 仅通知已显式注册接收器的正在运行的应用程序。
      【解决方案5】:

      步骤 1. 将 JitPack 存储库添加到您的构建文件中将其添加到存储库末尾的根 build.gradle 中:

      allprojects {
            repositories {
              ...
              maven { url 'https://jitpack.io' }
            }
          }
      

      步骤 2. 添加依赖项

      dependencies {
                  implementation 'com.github.SumonHub:EagleEye:1.0.0'
          }
      

      如果您不覆盖 Application 类,请编辑清单文件以在标记中设置 android:name,如下所示:

      <?xml version="1.0" encoding="utf-8"?>
      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.myapp">
          <application
                  android:name="org.sumon.eagleeye.EagleEyeApplication" >
              ...
          </application>
      </manifest>
      

      如果您确实重写了 Application 类,请将其更改为扩展 EagleEyeApplication(如果可能),如下所示:

      public class MyApplication extends EagleEyeApplication { ... }
      

      在你的活动/片段中获得如下状态

      EagleEyeObserver.setConnectivityListener(new OnChangeConnectivityListener() {
          @Override
          public void onChanged(boolean status) {
              Toast.makeText(MainActivity.this, "" + status, Toast.LENGTH_SHORT).show();
          }
      });
      

      更多信息here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-28
        • 2019-12-29
        • 2017-05-23
        相关资源
        最近更新 更多