#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)
Я надеюсь, что это сработает для вас.