【问题标题】:ANDROID Show a dialog when the Internet/GPS loses connectivity or is not connectedANDROID 当 Internet/GPS 失去连接或未连接时显示对话框
【发布时间】:2015-01-06 09:41:12
【问题描述】:

[编辑]

我想在 Internet 或 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 个 toast,如果我修改状态一段时间后,连接 toast 停止出现或在长时间等待后出现。

另外,当互联网备份时,如何关闭启动画面活动?

【问题讨论】:

  • 广播接收器听起来很酷,所以发布你的接收器并让人们帮助你..基本上只需将你的互联网/gps 检查方法放在你的接收器中,如果全部为真,让它们返回一个布尔值,然后你关闭你的应用程序并通过活动显示对话框
  • @Juvie22 您在检测 Internet/GPS 连接何时丢失时遇到问题吗?或者您可以正确检测到它,但在显示对话框时遇到问题?
  • @Elltz 编辑了更多信息
  • @ana 01 广播接收器无法立即工作
  • 你是否在清单中指定了接收方。

标签: android


【解决方案1】:

您可以创建一个Service 类并将TimerTaskTimer 一起使用并给它一个重新开始的时间,这样您就可以从您已经拥有的receiver 开始您的service 并制作它(receiver) 用

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

并指定权限&lt;uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /&gt;

并让您的接收器调用服务类-(或者您可以在那里检查您的东西-(考虑到我制作的 cmets))通过在您的 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 步:

    创建一个名为NetworkStatusJava Class

    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 步:

    创建另一个名为AlertDialogManagerClass

    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 Activity 的使用情况:

    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 步: 创建一个名为 InternetConnectorReceiver

    的 BroadcastReceiver 类
    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 并显示对话框:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-26
      • 2021-05-25
      • 2014-03-11
      • 2022-08-11
      • 1970-01-01
      • 2017-09-05
      • 1970-01-01
      相关资源
      最近更新 更多