android - 连接到互联网后如何自动刷新网页 View

标签 android webview android-webview auto-update android-internet

在我的应用程序中,我实现了一个 webview 来显示包含一些有用信息的网页。现在,最初我检查了 Netwotk 是否可用。如果可用,它将连接到网页。如果没有,它会显示一个警报对话框,告诉您设备上没有互联网连接。之后它将重定向到设备的设置选项。我可以从此选项切换到 wifi。但问题是打开wifi后,当我回到工作页面时,它没有自动更新。我必须转到我的选项菜单页面,然后单击按钮,然后它会被更新。如何在打开互联网后像谷歌浏览器一样更新页面。这是我的代码

我的编辑代码

    public class JobPage extends AppCompatActivity {

    private WebView webView;

    public static final String WIFI = "Wi-Fi";
    public static final String ANY = "Any";
    private static final String URL = "https://app.com";

    private static boolean wifiConnected = false;
    private static boolean mobileConnected = false;
    public static boolean refreshDisplay = true;

    public static String sPref = null;

    // The BroadcastReceiver that tracks network connectivity changes.
    private NetworkReceiver receiver = new NetworkReceiver();


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

        webView=(WebView)findViewById(R.id.webView);
       // Registers BroadcastReceiver to track network connection changes.
        IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
        receiver = new NetworkReceiver();
        this.registerReceiver(receiver, filter);

    }


    @Override
    public void onDestroy() {
        super.onDestroy();
        // Unregisters BroadcastReceiver when app is destroyed.
        if (receiver != null) {
            this.unregisterReceiver(receiver);
        }
    }
    // Refreshes the display if the network connection and the
    // pref settings allow it.


    // Checks the network connection and sets the wifiConnected and mobileConnected
    // variables accordingly.
    @Override
    public void onStart () {
        super.onStart();

        // Gets the user's network preference settings
        SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);

        // Retrieves a string value for the preferences. The second parameter
        // is the default value to use if a preference value is not found.
        sPref = sharedPrefs.getString("listPref", "Wi-Fi");

        updateConnectedFlags();

        if(refreshDisplay){
            loadPage();
        }
    }
    public void updateConnectedFlags() {
        ConnectivityManager connMgr = (ConnectivityManager)
                getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo activeInfo = connMgr.getActiveNetworkInfo();
        if (activeInfo != null && activeInfo.isConnected()) {
            wifiConnected = activeInfo.getType() == ConnectivityManager.TYPE_WIFI;
            mobileConnected = activeInfo.getType() == ConnectivityManager.TYPE_MOBILE;
        } else {
            wifiConnected = false;
            mobileConnected = false;
        }
    }
    public void loadPage() {
        if (((sPref.equals(ANY)) && (wifiConnected || mobileConnected))
                || ((sPref.equals(WIFI)) && (wifiConnected))) {
            webView.loadUrl(URL);
            webView.getSettings().setJavaScriptEnabled(true);
            webView.setWebViewClient(new WebViewClient());
            refreshDisplay=true;

        } else {
            errorDialog();
        }
    }

    public void errorDialog(){
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder
                .setMessage("No internet connection on your device. Would you like to enable it?")
                .setTitle("No Internet Connection")
                .setCancelable(false)
                .setPositiveButton("Enable Internet",
                        new DialogInterface.OnClickListener()
                        {
                            public void onClick(DialogInterface dialog, int id)
                            {
                                Intent dialogIntent = new Intent(android.provider.Settings.ACTION_SETTINGS);
                                dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                                getApplicationContext().startActivity(dialogIntent);
                            }
                        });
        builder.setNegativeButton(" Cancel ", new DialogInterface.OnClickListener()
        {
            public void onClick(DialogInterface dialog, int id)
            {
                dialog.cancel();
            }
        });

        AlertDialog alert = builder.create();
        alert.show();
    }

}

我的 NetworkReceiver 类
    public class NetworkReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        ConnectivityManager conn = (ConnectivityManager)
                context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = conn.getActiveNetworkInfo();

        // Checks the user prefs and the network connection. Based on the result, decides whether
        // to refresh the display or keep the current display.
        // If the userpref is Wi-Fi only, checks to see if the device has a Wi-Fi connection.
        if (WIFI.equals(sPref) && networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
            // If device has its Wi-Fi connection, sets refreshDisplay
            // to true. This causes the display to be refreshed when the user
            // returns to the app.

            Toast.makeText(context, "Wi-fi is connected", Toast.LENGTH_SHORT).show();
            JobPage.refreshDisplay = true;

            // If the setting is ANY network and there is a network connection
            // (which by process of elimination would be mobile), sets refreshDisplay to true.
        } else if (ANY.equals(sPref) && networkInfo != null) {
            JobPage.refreshDisplay = true;

            // Otherwise, the app can't download content--either because there is no network
            // connection (mobile or Wi-Fi), or because the pref setting is WIFI, and there
            // is no Wi-Fi connection.
            // Sets refreshDisplay to false.
        } else {
            JobPage.refreshDisplay = false;
            Toast.makeText(context, "Lost internet connection", Toast.LENGTH_SHORT).show();
        }
    }
}

最佳答案

您需要添加一个 BroadcastReceiver 来处理 CONNECTIVITY_CHANGE .这将允许您的应用在网络状态发生变化时收到通知,例如没有连接互联网。

public class NetworkChangeReceiver extends BroadcastReceiver {

   @Override
   public void onReceive(final Context context, final Intent intent) {
       boolean isOnline = isOnline( context );
       // Fire an event with the new status of the network.
       Bus bus = new Bus(ThreadEnforcer.MAIN);
       bus.post( new NetworkEvent( isOnline ) );
   }

    public boolean isOnline(Context context) {
         ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
         NetworkInfo netInfo = cm.getActiveNetworkInfo();
         //should check null because in airplane mode it will be null
         return (netInfo != null && netInfo.isConnected());
     }
}

在您的 list 中,您还需要添加该接收器。
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 <uses-permission android:name="android.permission.INTERNET" />
 <receiver
    android:name="NetworkChangeReceiver"
    android:label="NetworkChangeReceiver" >
    <intent-filter>
        <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
    </intent-filter>
</receiver>

现在,为了实际发送数据,我将使用 Otto ,事件总线库。

创建一个类来包含我们将放在事件总线上的信息。
public class NetworkEvent {

    private boolean isOnline;

    public NetworkEvent( boolean isOnline ) {
        this.isOnline = isOnline;
    }
}

最后在您的 JobPage Activity 中,注册(并在 onDestroy 上取消注册)总线,然后您可以 Subscribe到事件。
public class JobPage extends AppCompatActivity {
    @Override
    protected void onCreated( Bundle savedInstanceState ) {
        ...
        Bus bus = new Bus(ThreadEnforcer.MAIN);
        bus.register(this);
        ...
    }


    ...
    @Subscribe
    public void onNetworkChange( NetworkEvent event ) {
         if( event.isOnline ) {
            // Do refresh.
         }
    }
}

关于android - 连接到互联网后如何自动刷新网页 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45710559/

相关文章:

java - 在主屏幕上使用后台服务绘制位图图像

android - Firebase ui - 在 android 中为 FirebaseRecyclerView 设置标题 View

android - Xamarin.Forms:具有 CSS 转换和 JS 滑动的页面在 Android WebView 自定义渲染器中不起作用,而在 Chrome 中起作用

android 不允许加载本地资源 :file:///android_asset

android - 无法在 Android 的 ndk-gdb 中达到断点

android - 到目前为止,无法在 Android 上实现无缝音频循环

android - 在 WebView 中访问本地文件

html - 分页符不适用于图像标签

底部带有admob广告的Android webview

android - WebViewFragment webView 在执行 FragmentTransaction 后为 null