ANDROID Показывает диалог, когда Интернет /GPS теряет связь или не подключен

[EDITED]

Я хочу показать экран заставки/диалог, когда Интернет или GPS отключены или не подключены, поэтому пользователь не может использовать приложение, пока соединение не станет хорошим снова.

Я пробовал с некоторыми вещательными приемниками, но у всех были проблемы. Один из них:

public class ConnectivityChangeReceiver extends BroadcastReceiver {

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

    String status = NetworkUtil.getConnectivityStatusString(context);

    Toast.makeText(context, status, Toast.LENGTH_LONG).show();
    if(status.equals("Not connected to Internet")) {
        Intent splashIntent = new Intent(context, SplashScreen.class);
        splashIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(splashIntent);
 //I also had a Toast for internet is connected
    }

}
}

И класс util:

public class NetworkUtil {

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


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 String getConnectivityStatusString(Context context) {
    int conn = NetworkUtil.getConnectivityStatus(context);
    String status = null;
    if (conn == NetworkUtil.TYPE_WIFI) {
        status = "Wifi enabled";
    } else if (conn == NetworkUtil.TYPE_MOBILE) {
        status = "Mobile data enabled";
    } else if (conn == NetworkUtil.TYPE_NOT_CONNECTED) {
        status = "Not connected to Internet";
    }
    return status;
}
}

Проблемы: он не работает мгновенно. Обычно я получаю 5 тостов подряд, когда интернет отключен, и через некоторое время, если я изменю статус, соединение перестает появляться или появляется после долгого ожидания времени.

Также, как закрыть действие Splash Screen при резервном копировании в Интернете?

Ответ 1

вы можете создать класс Service и использовать TimerTask с Timer и дать ему время для начала, с помощью этого вы можете запустить свой Service из receiver, который у вас уже есть, и сделать его (receiver) прослушать BOOT_COMPLETED с помощью

<intent-filter>
    <action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>

и укажите разрешение <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

и позвольте вашему приемнику позвонить в класс обслуживания - (или вы можете проверить свой материал там - (учтите комментарии, которые я сделал)), выполнив это в onReceive

boolean isMyServiceRunning(Class<?> serviceClass, Context t) {
    ActivityManager manager = (ActivityManager) t.getSystemService(Context.ACTIVITY_SERVICE);
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
        if (serviceClass.getName().equals(service.service.getClassName())) {
            return true;
        }
    }
    return false;
}

и если он возвращает функцию ложного запуска с помощью

Intent i = new Intent(context, MyService.class);
context.startService(i);

то в вашей службе выполните это

public class MyService extends Service {
Timer timer; TimerTask task;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // TODO Auto-generated method stub

    timer = new Timer();
    task = new TimerTask() {  
      @Override                 
      public void run() { 
          // put here your code for checking 

          String status = NetworkUtil.getConnectivityStatusString(context);
          // i am having nesting problems so put this in a handler() ok
          Toast.makeText(context, status, Toast.LENGTH_LONG).show();
          if(status.equals("Not connected to Internet")) {
          Intent splashIntent = new Intent(context, SplashScreen.class);
          splashIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
          context.startActivity(splashIntent);  
           }
        // handler() code should end here           
     };                             
    timer.schedule(task, 0, 3000);  // repeat every 3 seconds

    return START_STICKY;
  }
}

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

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

Ответ 2

Попробуйте ниже решение

ШАГ 1:

Сделайте Java Class с именем NetworkStatus

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

public class NetworkStatus 
{
    Context context;

    public NetworkStatus(Context context) 
    {
        this.context = context;
    }

    public boolean isNetworkOnline() 
    {
        boolean status = false;

        try
        {
            ConnectivityManager cm = (ConnectivityManager) 
                    context.getSystemService(Context.CONNECTIVITY_SERVICE);

            NetworkInfo netInfo = cm.getNetworkInfo(0);

            if (netInfo != null && netInfo.getState() == NetworkInfo.State.CONNECTED) 
            {
                status = true;
            } 
            else 
            {
                netInfo = cm.getNetworkInfo(1);

                if (netInfo != null && netInfo.getState() == NetworkInfo.State.CONNECTED) 
                {
                    status = true;
                }
            }
        } 
        catch (Exception e) 
        {
            e.printStackTrace();

            return false;
        }

        return status;
    }

}

ШАГ 2:

Сделайте еще один Class с именем AlertDialogManager

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.provider.Settings;
import com.lmkt.wfm.R;
import com.lmkt.wfm.activities.ActivityMainScreen;

public class AlertDialogManager 
{
    Context context;

    public AlertDialogManager(Context context) 
    {
        this.context = context;
    }

    public void showAlertDialog(String title, final String message, final Boolean status) 
    {
        AlertDialog.Builder alertDialog = new AlertDialog.Builder(context);

        alertDialog.setTitle(title);

        alertDialog.setMessage(message);

        if(status != null)
        {
            alertDialog.setIcon((status) ? R.drawable.success : R.drawable.fail);
        }

        alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() 
        {
            public void onClick(DialogInterface dialog, int which) 
            {   
                if(message.contains("You do not have Internet Connection"))
                {
                      ((Activity) context).finish();
                }

                dialog.dismiss();
            }
        });

        alertDialog.show();
    }
}

ШАГ 3: Использование вашей активности Splash:

AlertDialogManager alert;

NetworkStatus ns;

ns = new NetworkStatus(context);

if(!(ns.isNetworkOnline()))
        {
            alert = new AlertDialogManager(context);

            alert.showAlertDialog("Internet Connection!", "You do not have Internet Connection. "
                    + "Please connect to the "
                    + "Internet to sync Data From Server...", false);
        }

Ответ 3

ШАГ 1:  Откройте AndroidManifest.xml и добавьте широковещательный приемник.

<receiver
        android:name=".Util.InternetConnectorReceiver"
        android:enabled="true">
        <intent-filter>
            <!-- Intent filters for broadcast receiver -->
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>`

ШАГ 2: создайте активность с помощью темы диалога:

<activity
            android:name=".Activity.ActivityDialogInternet"
            android:theme="@style/AppTheme.Dark.Dialog"></activity>

ШАГ 3: Создайте класс BroadcastReceiver с именем InternetConnectorReceiver

public class InternetConnectorReceiver extends BroadcastReceiver {

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

    if (intent.getAction().equalsIgnoreCase(Intent.ACTION_BOOT_COMPLETED) ||
            intent.getAction().equalsIgnoreCase("android.net.conn.CONNECTIVITY_CHANGE")) {
        Intent checkIntent = new Intent(context, ConnectivityCheck.class);
        context.startService(checkIntent);
    }
}}

ШАГ 4: Сделайте еще один класс обслуживания с именем ConnectivityCheck:

public class ConnectivityCheck extends Service {

@Override
public void onCreate() {
    super.onCreate();
    if (!checkConnection()) {
        Toast.makeText(context, "off", Toast.LENGTH_LONG).show();
        Intent dialogIntent = new Intent(this, ActivityDialogInternet.class);
        dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(dialogIntent);
    }
    stopSelf();
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}

private boolean checkConnection() {
    Log.i("wudfuyf", "checking started!!!!!!!!!!!!!!!!!!");
    ConnectivityManager cm =
            (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
    return activeNetwork != null &&
            activeNetwork.isConnectedOrConnecting();

}}

ШАГ 5: создайте действие под названием ActivityDialogInternet

public class ActivityDialogInternet extends AppCompatActivity {

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

ШАГ 6: При отключении подключения к Интернету ActivityDialogInternet и покажите диалог: