Android0911(Android裏的網絡連接)

網絡連接

查看網絡狀態ConnectivityManager、Context

查看當前的網絡狀態是應用能否上網的前提,ConnectivityManager類就是用來返回關於網絡連接狀態的查詢的類。它還通知應用程序時,網絡連接的變化。通過Context.getSystemService(Context.CONNECTIVITY_SERVICE).得到一個實例。而Context是一個可以得到應用網絡環境的全面信息的一個接口,這個抽象類的實現是由Android系統體提供的,它允許訪問應用程序特定的資源和類,以及應用級的操作。getSystemService()方法以名稱返回到系統級服務的句柄。返回的對象的類隨被請求的名稱而變化。CONNECTIVITY_SERVICE使用getSystemService(級)檢索的網絡連接管理connectivitymanager。

ConnectivityManager mConnectManger= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

ConnectManger的getActiveNetworkInfo()方法返回當前活動的默認數據網絡的詳細信息。得到的是NetworkInfo類型,NetworkInfo描述網絡接口的狀態。再通過調用該類的實例的getTypeName()得到當前的網絡的可讀名稱描述網絡的類型,例如“WiFi”或“移動”。

 NetworkInfo info=mConnectManger.getActiveNetworkInfo();              text_getDetail.setText(""+info.getTypeName());

WebView

Android裏的應用程序裏有時需要展示一些網頁,但我們又不想使用瀏覽器打開,這是就用到了控件WebView,可以藉助它在應用程序中嵌入一個瀏覽器,但WebView要求訪問Internet和登錄網頁信息因此需要INTERNET權限在 Android Manifest.xml,例如:

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
 <WebView
        android:id="@+id/webview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></WebView>

loadUrl()同於加載給定的網址;

mWebView.loadUrl("http://www.apple.com/cn/ipad-pro/");

setWebChromeClient主要處理解析,渲染網頁等瀏覽器做的事情
WebChromeClient是輔助WebView處理Javascript的對話框,網站圖標,網站title,加載進度等 .使用WebChromeClient 可以操作Javascript dialogs(js腳本對話框), favicons(添加收藏的標誌), titles(標題), 和 progress(進度條).
簡單的說,如果除了加載HTML的話,只需要用WebViewClient即可,但是在進行兼容互聯網上附加javascript的頁面的時候和調用javascript對話框的時候,或者功能較爲複雜的內嵌操作的時候,建議使用WebChromeClient 。

WebViewClient就是幫助WebView處理各種通知、請求事件的,具體來說包括:

onLoadResource 在加載頁面資源時會調用,每一個資源(比如圖片)的加載都會調用一次。

onPageStart 在頁面加載開始時調用。

onPageFinish 在頁面加載結束時調用。

onReceiveError 在加載失敗時調用,提供報告錯誤信息。

onReceivedHttpAuthRequest 獲取返回信息授權請求

WebSettings 的常用方法介紹

1 setJavaScriptEnabled(true); //支持js腳步

2 setPluginsEnabled(true); //支持插件 目前新版本已不支持

3 setUseWideViewPort(false); //將圖片調整到適合webview的大小

4 setSupportZoom(true); //支持縮放

5 setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); //支持內容重新佈局

6 supportMultipleWindows(); //多窗口

7 setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //關閉webview中緩存

8 setAllowFileAccess(true); //設置可以訪問文件

9 setNeedInitialFocus(true); //當webview調用requestFocus時爲webview設置節點

10 setBuiltInZoomControls(true); //設置支持縮放

11 setJavaScriptCanOpenWindowsAutomatically(true); //支持通過JS打開新窗口

12 setLoadsImagesAutomatically(true); //支持自動加載圖片

WebViewClient 的方法總結

doUpdateVisitedHistory(WebView view, String url, boolean isReload) (更新歷史記錄)

onFormResubmission(WebView view, Message dontResend, Message resend) (應用程序重新請求網頁數據)

onLoadResource(WebView view, String url) 在加載頁面資源時會調用,每一個資源(比如圖片)的加載都會調用一次。

onPageStarted(WebView view, String url, Bitmap favicon) 這個事件就是開始載入頁面調用的,通常我們可以在這設定一個loading的頁面,告訴用戶程序在等待網絡響應。

onPageFinished(WebView view, String url) 在頁面加載結束時調用。同樣道理,我們知道一個頁面載入完成,於是我們可以關閉loading 條,切換程序動作。

onReceivedError(WebView view, int errorCode, String description, String failingUrl)(報告錯誤信息)

onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm)(獲取返回信息授權請求)

onReceivedSslError(WebView view, SslErrorHandler handler, SslError error)重寫此方法可以讓webview處理https請求。

onScaleChanged(WebView view, float oldScale, float newScale)(WebView發生改變時調用)

onUnhandledKeyEvent(WebView view, KeyEvent event)(Key事件未被加載時調用)

shouldOverrideKeyEvent(WebView view, KeyEvent event)重寫此方法才能夠處理在瀏覽器中的按鍵事件。

shouldOverrideUrlLoading(WebView view, String url)

在點擊請求的是鏈接是纔會調用,重寫此方法返回true表明點擊網頁裏面的鏈接還是在當前的webview裏跳轉,不跳到瀏覽器那邊。這個函數我們可以做很多操作,比如我們讀取到某些特殊的URL,於是就可以不打開地址,取消這個操作,進行預先定義的其他操作,這對一個程序是非常必要的。

WebChromeClient常用方法:

方法 說明

onCloseWindow 關閉WebView

onCreateWindow 創建WebView

onJsAlert 處理Javascript中的Alert對話框

onJsConfirm 處理Javascript中的Confirm對話框

onJsPrompt 處理Javascript中的Prompt對話框

onProgressChanged 加載進度條改變

onReceivedlcon 網頁圖標更改

onReceivedTitle 網頁Title更改

onRequestFocus WebView 顯示焦點

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.administrator.nneworkconnectionapp" >
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/networkconnection"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context=".MainActivity">
        <Button
            android:id="@+id/networkconnection"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="查看網絡連接狀態"/>
    <TextView
        android:id="@+id/text_connection"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="網絡狀態"/>
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    <WebView
        android:id="@+id/webview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></WebView>
        <ProgressBar
            android:id="@+id/progressbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal"/>
        <TextView
            android:id="@+id/textfailer"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="正在加載"/>
    </FrameLayout>
</LinearLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private Button btn_getDetail;
    private TextView text_getDetail;
    private ConnectivityManager mConnectManger;
    private WebView mWebView;
    private ProgressBar mProgresbar;
    private TextView mTextViewFailer;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //ConnectivityManager類就是用來返回關於網絡連接狀態的查詢的類。它還通知應用程序時,網絡連接的變化。
        // 通過Context.getSystemService(Context.CONNECTIVITY_SERVICE).得到一個實例
        //getSystemService()方法以名稱返回到系統級服務的句柄
        //CONNECTIVITY_SERVICE使用getSystemService(級)檢索的網絡連接管理connectivitymanager。
        mConnectManger= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        text_getDetail= (TextView) findViewById(R.id.text_connection);
        btn_getDetail= (Button) findViewById(R.id.networkconnection);
        btn_getDetail.setOnClickListener(this);
        mProgresbar= (ProgressBar) findViewById(R.id.progressbar);
        mTextViewFailer= (TextView) findViewById(R.id.textfailer);
        mWebView= (WebView) findViewById(R.id.webview);
        //loadUrl()同於加載給定的網址;
        mWebView.loadUrl("http://www.apple.com/cn/ipad-pro/");
        mWebView.setWebChromeClient(new WebChromeClient(){
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                super.onProgressChanged(view, newProgress);
                mProgresbar.setProgress(newProgress);
            }
        });
        mWebView.setWebViewClient(new WebViewClient(){
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                mProgresbar.setVisibility(View.VISIBLE);
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                mProgresbar.setVisibility(View.INVISIBLE);
            }

            @Override
            public void onReceivedError(WebView view, int errorCode,
                                        String description, String failingUrl) {
                super.onReceivedError(view, errorCode, description, failingUrl);
                mWebView.setVisibility(View.GONE);

                Toast.makeText(getApplicationContext(),"同步失敗onReceivedError,請稍後再試",Toast.LENGTH_SHORT).show();
                mTextViewFailer.setText("加載失敗!");
                mTextViewFailer.setVisibility(View.VISIBLE);
            }
        });

    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode==KeyEvent.KEYCODE_BACK){
            if (mWebView.canGoBack()){
                mWebView.goBack();
                return true;
            }else{
                finish();//關閉的當前界面
            }
        }
        return super.onKeyDown(keyCode, event);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.networkconnection:
//                mWebView.loadUrl("http://www.apple.com/cn/ipad-pro/");
                //ConnectManger的getActiveNetworkInfo()方法返回當前活動的默認數據網絡的詳細信息。
                // 得到的是NetworkInfo類型,NetworkInfo描述網絡接口的狀態
                NetworkInfo info=mConnectManger.getActiveNetworkInfo();
                if (info!=null&&info.isConnected()){
                    Toast.makeText(MainActivity.this, "有網絡連接", Toast.LENGTH_SHORT).show();
                    //getTypeName()得到當前的網絡的可讀名稱描述網絡的類型,例如“WiFi”或“移動”。
                    text_getDetail.setText(""+info.getTypeName());
                }else{
                    Toast.makeText(MainActivity.this,"無網絡連接",Toast.LENGTH_SHORT).show();
                }
                break;
        }
    }
}

這裏寫圖片描述

當網頁加載失敗時
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章