【android應用】網絡斷開彈窗功能---自定義彈窗、附帶斷網圖

因爲是做盒子,如果沒有連接到wifi或者有線網會導致體驗差,很多功能沒有辦法使用的問題。所以本篇我們就來看看如何實現斷網彈窗的問題。

一、基本思路

  1. 監聽廣播
  2. 彈窗
  3. 自定義彈窗

二、實現過程

1、監聽廣播

採用動態註冊的方式,實現廣播監聽網絡變化廣播("android.net.conn.CONNECTIVITY_CHANGE")

    private void initReceiver(Context context) {
        Loger.i(TAG, "initReceiver");
        IntentFilter timeFilter = new IntentFilter();
        timeFilter.addAction("android.net.ethernet.ETHERNET_STATE_CHANGED");
        timeFilter.addAction("android.net.ethernet.STATE_CHANGE");
        timeFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        timeFilter.addAction("android.net.wifi.WIFI_STATE_CHANGED");
        timeFilter.addAction("android.net.wifi.STATE_CHANGE");
        timeFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
        context.registerReceiver(netReceiver, timeFilter);
    }

    BroadcastReceiver netReceiver =new BroadcastReceiver(){
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            Loger.i(TAG, "onReceive:"+action);
            if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
                ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
                if (networkInfo != null && networkInfo.isAvailable()) {
                    int type2 = networkInfo.getType();
                    isAlerted = false;
                    String typeName = networkInfo.getTypeName();
                    switch (type2) {
                        case 0:
                        case 1:
                        case 9:
                            if(type2 == 0){
                                Loger.i(TAG, "MOBILE");
                            }else if(type2 == 1){
                                Loger.i(TAG, "WIFI");
                            }else{
                                Loger.i(TAG, "ETHERNET");
                            }
                            doDismissNetworkAlert();
                            SystemManager.getInstance().onNetWorkOK();
                            break;
                    }
                } else {
                    if(!isAlerted){
                        if ("com.android.settings".equals(SystemManager.getInstance().getTopActivity())) {
                            return;
                        }
                        doNetworkAlert(context);
                        Loger.i(TAG, "NO NETWORK CONNECT");
                    }
                }
            }
        }
    };

2、彈窗

使用原始的彈窗(AlertDialog.Builder)

    private static void doNetworkAlert(final Context context) {
        AlertDialog.Builder builder=new AlertDialog.Builder(context);
        builder.setPositiveButton(R.string.net_error_text,
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog,
                                        int whichButton) {
                        Intent intent = new Intent();
                        intent.setComponent(new ComponentName("com.android.settings", "com.android.settings.Settings"));
                        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK );
                        context.startActivity(intent);
                    }
                });
        alertDialog = builder.create();
        alertDialog.setTitle(R.string.net_error_title);
        alertDialog.setMessage(""+R.string.net_error_message);
        alertDialog.setCancelable(true);
        alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

        alertDialog.show();
    }

3、自定義彈窗

3.1 實現java

繼承Dialog,重寫接口

package com.android.vps.basic.manager;

import android.app.Dialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.support.annotation.NonNull;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import com.android.vps.basic.R;

public class CustomDialog extends Dialog {

    private CustomDialog(Context context, int themeResId) {
        super(context, themeResId);
    }

    public static class Builder {

        private View mLayout;

        private ImageView mIcon;
        private TextView mTitle;
        private TextView mMessage;
        private Button mButton;

        private View.OnClickListener mButtonClickListener;

        private CustomDialog mDialog;

        public Builder(Context context) {
            mDialog = new CustomDialog(context, R.style.Theme_AppCompat_Dialog);
            LayoutInflater inflater =
                    (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            //加載佈局文件
            mLayout = inflater.inflate(R.layout.custom_dialog, null, false);
            //添加布局文件到 Dialog
            mDialog.addContentView(mLayout, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT));

            mIcon = mLayout.findViewById(R.id.dialog_icon);
            mTitle = mLayout.findViewById(R.id.dialog_title);
            mMessage = mLayout.findViewById(R.id.dialog_message);
            mButton = mLayout.findViewById(R.id.dialog_button);
        }

        /**
         * 通過 ID 設置 Dialog 圖標
         */
        public Builder setIcon(int resId) {
            mIcon.setImageResource(resId);
            return this;
        }

        /**
         * 用 Bitmap 作爲 Dialog 圖標
         */
        public Builder setIcon(Bitmap bitmap) {
            mIcon.setImageBitmap(bitmap);
            return this;
        }

        /**
         * 設置 Dialog 標題
         */
        public Builder setTitle(@NonNull String title) {
            mTitle.setText(title);
            mTitle.setVisibility(View.VISIBLE);
            return this;
        }

        /**
         * 設置 Message
         */
        public Builder setMessage(@NonNull String message) {
            mMessage.setText(message);
            return this;
        }

        /**
         * 設置按鈕文字和監聽
         */
        public Builder setButton(@NonNull String text, View.OnClickListener listener) {
            mButton.setText(text);
            mButtonClickListener = listener;
            return this;
        }

        public CustomDialog create() {
            mButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    mDialog.dismiss();
                    mButtonClickListener.onClick(view);
                }
            });
            mDialog.setContentView(mLayout);
            mDialog.setCancelable(true);                //用戶可以點擊後退鍵關閉 Dialog
            mDialog.setCanceledOnTouchOutside(false);   //用戶不可以點擊外部來關閉 Dialog
            return mDialog;
        }
    }
}

3.2 UI定義

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="#ffffff">

    <!--綠色#7FFF00 白色#ffffff 紅色#CD0000-->
    <LinearLayout
        android:id="@+id/dialog_header"
        android:orientation="vertical"
        android:layout_width="330dp"
        android:layout_height="wrap_content"
        android:padding="16dp"
        android:gravity="center"
        android:background="#CD0000"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent">

        <!-- Icon -->
        <ImageView
            android:contentDescription="@id/dialog_title"
            android:id="@+id/dialog_icon"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:src="@drawable/net" />

        <!-- Title(default is gone) -->
        <TextView
            android:id="@+id/dialog_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="8dp"
            android:textSize="25sp"
            android:textStyle="bold"
            android:textColor="#ffffff"
            android:visibility="gone" />

    </LinearLayout>

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="16dp"
        android:gravity="center"
        app:layout_constraintTop_toBottomOf="@+id/dialog_header"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintBottom_toBottomOf="parent">

        <!-- Dialog Message -->
        <TextView
            android:id="@+id/dialog_message"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="8dp"
            tools:text="Dialog Message" />

        <Button
            android:id="@+id/dialog_button"
            android:layout_width="100dp"
            android:layout_height="42dp"
            android:layout_marginTop="16dp"
            android:layout_marginBottom="8dp"
            android:Color="#ffffff"
            android:textColor="#ffffff"
            android:text="goto setting">

        </Button>

    </LinearLayout>

</android.support.constraint.ConstraintLayout>

3.1 使用

    private static CustomDialog customDialog;
    @SuppressLint("ResourceType")
    private static void doNetworkAlert(final Context context) {

        customDialog = new CustomDialog.Builder(context)
            .setTitle("檢測到你的網絡已斷開")
            .setMessage("請您正確設置網絡連接")
            .setButton("去設置", new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            Intent intent = new Intent();
                            intent.setComponent(new ComponentName("com.android.settings", "com.android.settings.Settings"));
                            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK );
                            context.startActivity(intent);
                        }
                    }
            ).create();
        customDialog.setCancelable(true);
        customDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
        customDialog.show();
        isAlerted = true;
    }

3.4斷網圖

截圖

原圖

斷網圖
圖是透明的

三、問題

【android應用】Unable to add window -- token null is not for an application

四、結束語

以上就是本次分享的android應用開發中,網絡斷開彈窗功能---自定義彈窗。最後慣例給大家推介一下我們的技術工作號,歡迎大家來交流技術問題,謝謝!

在這裏插入圖片描述

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