Автоматическое обновление активности при наличии Интернета

#java #android #android-studio #android-activity #android-networking

#java #Android #android-studio #android-активность #android-сеть

Вопрос:

У меня есть ActivityNonetwork.java активность. Цель этого файла заключается в том, что при отсутствии сети / Интернета ActivityNonetwork отображается активность.

Я попробовал, я отключил Интернет, и эта страница была показана (успешно !!!), Но когда я снова включаю Интернет, страница не обновляется, и та же страница отображается даже после включения Интернета.

Мой ActivityNonetwork.java код:

 package com.Notely.SplashScreenandAccounts;

import androidx.activity.OnBackPressedCallback;
import androidx.activity.OnBackPressedDispatcherOwner;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.Notely.Notes.ActivityDashboard;

public class ActivityNonetwork extends AppCompatActivity {

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

    final Button exit = findViewById(R.id.exit);
    final Button retry = findViewById(R.id.retry);

    exit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            exitApp();
        }
    });
    retry.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            retryApp();
        }
    });

    if (checkNetwork() == true) {
        finish();
        overridePendingTransition(0, 0);
        startActivity(getIntent());
        overridePendingTransition(0, 0);

        Intent activitySplash = new Intent(this, ActivitySplash.class);
        startActivity(activitySplash);
    }
}

private boolean checkNetwork() {
    ConnectivityManager connectivityManager
            = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null amp;amp; activeNetworkInfo.isConnected();
}

public void exitApp() {
    Intent exitApp = new Intent(Intent.ACTION_MAIN);
    exitApp.addCategory( Intent.CATEGORY_HOME );
    exitApp.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(exitApp);
}

public void retryApp() {
    Intent retryApp = new Intent(this, ActivitySplash.class);
    startActivity(retryApp);
}

@Override
public void onBackPressed() {
    super.onBackPressed();
    Intent exitApp = new Intent(Intent.ACTION_MAIN);
    exitApp.addCategory( Intent.CATEGORY_HOME );
    exitApp.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(exitApp);
}
}
  

Есть ли какой-либо способ обновить страницу при появлении Интернета?

Комментарии:

1. Вам необходимо проверить подключение к Интернету в фоновом режиме с помощью ForegroundService

2. что вы подразумеваете под обновлением активности?? вы хотите, чтобы какой-либо конкретный блок кода был повторно выполнен или вы хотите, чтобы действие было воссоздано??

3. Вы можете зарегистрировать BroadcastReciver для проверки изменения состояния сети, и на его основе вы можете проверить, где вы находитесь в Сети или нет. CONNECTIVITY_CHANGE» /> и если он подключен, просто обновите активность!

Ответ №1:

вы просто проверяете сетевое подключение при создании активности, вам необходимо инициализировать observer для сетевых изменений

прочитайте эту статью и управляйте своим сетевым подключением

Ответ №2:

Вы можете добиться этого, используя широковещательный приемник в вашем проекте

Создайте класс, как показано ниже —

 public class NetworkChangeReceiver extends BroadcastReceiver {

@Override
public void onReceive(final Context context, final Intent intent) {
   PrefManager.getInstance(context).setPreviousNetworkStatus
   (NetworkUtil.getConnectivityStatusString(context));
 }
}
  

Затем создайте класс ниже —

 class NetworkUtil {

private static int TYPE_WIFI = 1;
private static int TYPE_MOBILE = 2;
private static int TYPE_NOT_CONNECTED = 0;


private 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;
}

static String getConnectivityStatusString(Context context) {
    int conn = NetworkUtil.getConnectivityStatus(context);
    String status = null;
    if (conn == NetworkUtil.TYPE_WIFI) {
        status = context.getString(R.string.wifi_enabled);
    } else if (conn == NetworkUtil.TYPE_MOBILE) {
        status = context.getString(R.string.mobile_data_enable);
    } else if (conn == NetworkUtil.TYPE_NOT_CONNECTED) {
        status = context.getString(R.string.not_connected_to_internet);
    }
    return status;
 }
}
  

Создайте класс PrefsManager — это не обязательно для создания отдельного класса для этой функции. Вы можете добавить этот код в свой MainActivity.

 public class PrefManager {

public static final String PREVIOUS_NETWORK_STATE = "previous_network_state";

private static SharedPreferences sharedPreferences;
private static PrefManager prefManager;

private PrefManager(Context context) {
    sharedPreferences = context.getSharedPreferences(PREFERENCE_NAME, 
    Context.MODE_PRIVATE);
}

public static PrefManager getInstance(Context context) {
    if (prefManager == null) {
        prefManager = new PrefManager(context);
    }
    return prefManager;
}

public SharedPreferences getSharedPreferences() {
    return sharedPreferences;
}

public void setPreviousNetworkStatus(String status) {
    sharedPreferences.edit().putString(PREVIOUS_NETWORK_STATE, status).apply();
}

public String getPreviousNetworkStatus() {
    return sharedPreferences.getString(PREVIOUS_NETWORK_STATE, "");
}
}
  

В MainActivity

  private NetworkChangeReceiver networkChangeReceiver = NetworkChangeReceiver()
  

В onCreate метод регистрирует приемник

  registerReceiver(
        networkChangeReceiver,
        IntentFilter("android.net.conn.CONNECTIVITY_CHANGE")
    )
  

Переопределить приведенный ниже метод

 @Override void onSharedPreferenceChanged(SharedPreferences sharedPreferences,String 
key) {
    if (key == PrefManager.PREVIOUS_NETWORK_STATE) {
        onNetworkChanged()
    }
 }
  

Затем создайте этот метод —

 private void onNetworkChanged() {
    // your code here 

    finish();
    overridePendingTransition(0, 0);
    startActivity(getIntent());
    overridePendingTransition(0, 0);

    Intent activitySplash = new Intent(this, ActivitySplash.class);
    startActivity(activitySplash);
}
  

отменить регистрацию получателя в методе onDestroy

  unregisterReceiver(networkChangeReceiver)
  

Я надеюсь, что это сработает для вас.