全局监听网络变化并弹出提示框工具

主要分为三步:①:创建网络出错的弹窗 ②:获取当前显示的Activity ③:监听网络变化,在网络异常的情况下显示弹窗。

第一步:创建网络出错提示的弹窗
NetErrorDialog.java

package example.com.dialog;

import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Handler;
import android.os.Looper;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.view.View;

import example.com.reminder.R;

/**
 * ================================================
 * 作    者:zhoujianan
 * 版    本:v1.0
 * 创建日期:2020/5/8
 * 描    述:
 * 修订历史:
 * ================================================
 */
public class NetErrorDialog implements DialogHelper.IOnActivityStart {

    private RemindDialog mRemindDialog;
    private DialogInterface.OnDismissListener mOnDismissListener;
    private Handler mHandler = new Handler(Looper.getMainLooper());


    public static NetErrorDialog newInstance() {
        return new NetErrorDialog();
    }

    public void showNow() {
        Activity activity = DialogHelper.getInstance().getCurrentActivity();
        if (activity != null) {
            setDialog(activity);
            mRemindDialog.show();
            DialogHelper.getInstance().addOnActivityStart(this);
        }
    }

    @Override
    public void onActivityStart(Activity activity) {
        if (mRemindDialog != null) {
            mRemindDialog.dismiss();
        }
        mHandler.removeCallbacks(mRestartRunnable);
        mHandler.postDelayed(mRestartRunnable, 500);
    }

    private Runnable mRestartRunnable = new Runnable() {
        @Override
        public void run() {
            Activity activity = DialogHelper.getInstance().getCurrentActivity();
            if (activity != null) {
                setDialog(activity);
                mRemindDialog.show();
            }
        }
    };

    private void setDialog(Activity activity) {
        mRemindDialog = new NetErrorDialog.RemindDialog(activity);
        mRemindDialog.setOwnerActivity(activity);
    }

    private class RemindDialog extends Dialog {
        View confirmView;

        public RemindDialog(@NonNull Context context) {
            super(context, R.style.Dialog_Fullscreen);
            setContentView(R.layout.dialog_net_error);
            initView();
            setOnShowListener(new OnShowListener() {
                @Override
                public void onShow(DialogInterface dialog) {
                    confirmView.requestFocus();
                }
            });
        }

        private void initView() {
            confirmView = findViewById(R.id.bt_confirm);
            confirmView.setOnClickListener(this::checkNet);
            findViewById(R.id.bt_cancel).setOnClickListener(v -> exitDialog());
        }

        private void checkNet(View view) {
            getOwnerActivity().startActivity(new Intent(Settings.ACTION_WIFI_SETTINGS));
        }
    }

    public boolean isShowing() {
        if (mRemindDialog != null) {
            return mRemindDialog.isShowing();
        }
        return false;
    }

    public void exitDialog() {
        if (mRemindDialog != null) {
            mRemindDialog.dismiss();
            mOnDismissListener.onDismiss(mRemindDialog);
        }
        DialogHelper.getInstance().removeOnActivityStart(this);
        mHandler.removeCallbacksAndMessages(null);
    }

    public  void setOnDismissListener(DialogInterface.OnDismissListener onDismissListener) {
        mOnDismissListener = onDismissListener;
    }
}

dialog_net_error.xml

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

    <View
        android:id="@+id/bg_view"
        android:layout_width="@dimen/d760"
        android:layout_height="@dimen/d360"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        android:background="#E6051230"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="@dimen/d32"
        android:textColor="#FFF"
        android:layout_marginTop="@dimen/d36"
        app:layout_constraintTop_toTopOf="@id/bg_view"
        android:layout_marginLeft="@dimen/d32"
        app:layout_constraintStart_toStartOf="@id/bg_view"
        android:text="Network is unavailable, please check the network"
        />

    <Button
        android:id="@+id/bt_confirm"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="@id/bg_view"
        app:layout_constraintEnd_toEndOf="@+id/bt_cancel"
        android:layout_marginBottom="@dimen/d64"
        app:layout_constraintBottom_toBottomOf="@id/bg_view"
        android:textColor="#FFF"
        android:textSize="@dimen/d32"
        android:background="@drawable/login_word_select"
        android:text="Confirm"
        />

    <Button
        android:id="@+id/bt_cancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="@dimen/d50"
        app:layout_constraintStart_toEndOf="@id/bt_confirm"
        app:layout_constraintEnd_toEndOf="@id/bg_view"
        android:layout_marginBottom="@dimen/d64"
        android:layout_marginRight="@dimen/d68"
        app:layout_constraintBottom_toBottomOf="@id/bg_view"
        android:textColor="#FFF"
        android:textSize="@dimen/d32"
        android:text="Cancel"
        android:background="@drawable/login_word_select"
        />

</android.support.constraint.ConstraintLayout>

login_word_select.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/word_inner_bg_focused" android:state_pressed="true" />
    <item android:drawable="@drawable/word_inner_bg_focused" android:state_focused="false" android:state_selected="true" />
    <item android:drawable="@drawable/word_inner_bg_focused" android:state_focused="true" />
    <item android:drawable="@drawable/word_inner_bg" />
</selector>

word_inner_bg_focused.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="@dimen/d2" />
    <solid android:color="#04A6FB" />
</shape>

word_inner_bg.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="@dimen/d12" />
</shape>

styles.xml

 <style name="Dialog_Fullscreen">
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowBackground">@android:color/transparent</item><!--背景透明-->
    </style>

第二步:获取当前显示的Activity
DialogHelper.java

package example.com.dialog;

import android.app.Activity;
import android.app.Application;
import android.os.Bundle;

import java.util.ArrayList;
import java.util.List;

import example.com.SLog;

/**
 * ================================================
 * 作    者:zhoujianan
 * 版    本:v1.0
 * 创建日期:2020/5/8
 * 描    述:
 * 修订历史:
 * ================================================
 */
public class DialogHelper {
    private Application mApplication;
    public static DialogHelper sDialogHelper;
    private Activity mCurrentActivity;
    private List<IOnActivityStart> mOnActivityStartList = new ArrayList<>();

    public static DialogHelper getInstance() {
        return sDialogHelper;
    }

    public static void setup(Activity activity) {
        sDialogHelper = new DialogHelper(activity);
    }

    public static void release() {
        if (sDialogHelper != null) {
            sDialogHelper.mApplication.unregisterActivityLifecycleCallbacks(sDialogHelper.mActivityLifecycleCallbacks);
            sDialogHelper.mOnActivityStartList.clear();
        }
    }

    public DialogHelper(Activity activity) {
        mApplication = activity.getApplication();
        mApplication.registerActivityLifecycleCallbacks(mActivityLifecycleCallbacks);
        mActivityLifecycleCallbacks.onActivityStarted(activity);

    }

    private final Application.ActivityLifecycleCallbacks mActivityLifecycleCallbacks = new Application.ActivityLifecycleCallbacks() {
        @Override
        public void onActivityCreated(Activity activity, Bundle savedInstanceState) {

        }

        @Override
        public void onActivityStarted(Activity activity) {
            mCurrentActivity = activity;
            for (IOnActivityStart onActivityStart  : mOnActivityStartList) {
                onActivityStart.onActivityStart(activity);
            }
        }

        @Override
        public void onActivityResumed(Activity activity) {

        }

        @Override
        public void onActivityPaused(Activity activity) {

        }

        @Override
        public void onActivityStopped(Activity activity) {

        }

        @Override
        public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

        }

        @Override
        public void onActivityDestroyed(Activity activity) {
            if (mCurrentActivity == activity) {
                SLog.d("DialogHelper", "onActivityDestroyed =>" + activity);
                mCurrentActivity = null;
            }
        }
    };

    public Activity getCurrentActivity() {
        return mCurrentActivity;
    }

    public void addOnActivityStart(IOnActivityStart onActivityStart) {
        mOnActivityStartList.add(onActivityStart);
    }

    public void removeOnActivityStart(IOnActivityStart onActivityStart) {
        mOnActivityStartList.remove(onActivityStart);
    }

    public interface IOnActivityStart {
        void onActivityStart(Activity activity);
    }

}

第三步:监听网络变化
RemindManager.java

package example.com.dialog;

import android.app.Activity;
import android.app.Application;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

import example.com.SLog;

/**
 * ================================================
 * 作    者:zhoujianan
 * 版    本:v1.0
 * 创建日期:2020/5/8
 * 描    述:
 * 修订历史:
 * ================================================
 */
public class RemindManager {
    private static final String TAG = "RemindManager";
    private static RemindManager sRemindManager;
    private final NetErrorDialog mNetErrorDialog;
    private Application mApplication;

    public RemindManager(Activity activity) {
        mNetErrorDialog = NetErrorDialog.newInstance();
        mNetErrorDialog.setOnDismissListener(this::onNetDialogDismiss);
        mApplication = activity.getApplication();
        DialogHelper.setup(activity);
        start();
    }

    public static void setup(Activity activity) {
        if (sRemindManager != null) {
            sRemindManager.exit();
        }
        sRemindManager = new RemindManager(activity);
    }

    public static RemindManager newInstance() {
        return sRemindManager;
    }

    private void start() {
        mApplication.registerReceiver(mNetBroadcastReceiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
    }

    private void exit() {
        mApplication.unregisterReceiver(mNetBroadcastReceiver);
        DialogHelper.release();
    }

    private BroadcastReceiver mNetBroadcastReceiver = new BroadcastReceiver() {
        private boolean isAvailable;

        @Override
        public void onReceive(Context context, Intent intent) {
            if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
                ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo networkInfo = cm.getActiveNetworkInfo();
                if (networkInfo != null && networkInfo.isAvailable()) {
                    if (!isAvailable) {
//                        handleNetRestore();
                        mHandleNetListener.handleNetRestore();
                        mNetErrorDialog.exitDialog();
                    }
                    isAvailable = true;
                } else {
                    isAvailable = false;
                    if (!mNetErrorDialog.isShowing()) {
                        mNetErrorDialog.showNow();
                        mHandleNetListener.handleNetLose();
//                        handleNetLose();
                    }
                }

            }
        }
    };

    private    IHandleNetListener mHandleNetListener;
    public  void setNetHandleListener(IHandleNetListener handleListener) {
        mHandleNetListener = handleListener;
    }
    public interface IHandleNetListener {
        void handleNetLose();

        void handleNetRestore();
    }

    private void handleNetLose() {
        SLog.i(TAG,"处理网络断开");
    }

    private void handleNetRestore() {
        SLog.i(TAG,"处理网络恢复");
    }

    private void onNetDialogDismiss(DialogInterface dialog) {
        //处理NetDialog dismiss的回调
        SLog.i(TAG, "NetDialogDismiss");
    }

}



最后,使用:

package example.com.reminder;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import example.com.SLog;
import example.com.dialog.RemindManager;

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        RemindManager.setup(this);
        RemindManager.newInstance().setNetHandleListener(new RemindManager.IHandleNetListener() {
            @Override
            public void handleNetLose() {
                SLog.i(TAG,"网络出错辽");
            }

            @Override
            public void handleNetRestore() {
                SLog.i(TAG,"网络恢复辽");

            }
        });
        findViewById(R.id.bt_jump_to_second).setOnClickListener(v -> startSecond());
    }

    private void startSecond() {
        Intent i = new Intent(this, SecondActivity.class);
        startActivity(i);
        finish();
    }
}

全局监听网络变化并弹出提示框工具_第1张图片全局监听网络变化并弹出提示框工具_第2张图片
在这里插入图片描述

Slog.java

package example.com;

import android.util.Log;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 日志打印工具
 */
public class SLog {
    private static final String TAG_FILTER = "_Test";
    public static final int VERBOSE = 2; ///显示全部信息
    public static final int DEBUG = 3;   ///显示调试信息
    public static final int INFO = 4;   ///显示一般信息
    public static final int WARN = 5;   ///显示警告信息
    public static final int ERROR = 6;  ///显示错误信息
    public static final int ASSERT = 7;

    private static int mLevel = 0;
    public static boolean isUpLog = false;


    public static void setLevel(int level) {
        mLevel = level;
    }

    public static int getLevel() {
        return mLevel;
    }

    public static void v(String tag, String msg) {
        if (mLevel <= VERBOSE) {
            Log.v(tag + TAG_FILTER, msg);
        }
        reportLogMsg(tag, msg);
    }

    public static void d(String tag, String msg) {
        if (mLevel <= DEBUG) {
            Log.d(tag + TAG_FILTER, msg);
        }
        reportLogMsg(tag, msg);
    }

    public static void i(String tag, String msg) {
        if (mLevel <= INFO) {
            Log.i(tag + TAG_FILTER, msg);
        }
        reportLogMsg(tag, msg);
    }

    public static void w(String tag, String msg) {
        if (mLevel <= WARN) {
            Log.w(tag + TAG_FILTER, msg);
        }
        reportLogMsg(tag, msg);
    }

    public static void e(String tag, String msg) {
        if (mLevel <= ERROR) {
            Log.e(tag + TAG_FILTER, msg);
        }
        reportLogMsg(tag, msg);
    }

    public static void a(String tag, String msg) {
        if (mLevel <= ASSERT) {
            Log.wtf(tag + TAG_FILTER, msg);
        }
        reportLogMsg(tag, msg);
    }

    private static void reportLogMsg(String tag, String msg) {
        if (isUpLog) {
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append("   ").append(tag).append(":   ").append(msg);
            writeToFile(stringBuilder);
        }
    }


    private static SimpleDateFormat myLogSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public static void writeToFile(StringBuilder str) {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append(myLogSdf.format(new Date())).append(str);
        //TODO 上传日志
//        ReportLogUtil.getInstance().setInputText(stringBuilder.toString());
    }
}

dimens.xml

<?xml version="1.0" encoding="utf-8"?>
<resources><dimen name="d1">1.0px</dimen>
<dimen name="d2">2.0px</dimen>
<dimen name="d3">3.0px</dimen>
<dimen name="d4">4.0px</dimen>
<dimen name="d5">5.0px</dimen>
<dimen name="d6">6.0px</dimen>
<dimen name="d7">7.0px</dimen>
<dimen name="d8">8.0px</dimen>
<dimen name="d9">9.0px</dimen>
<dimen name="d10">10.0px</dimen>
<dimen name="d11">11.0px</dimen>
<dimen name="d12">12.0px</dimen>
<dimen name="d13">13.0px</dimen>
<dimen name="d14">14.0px</dimen>
<dimen name="d15">15.0px</dimen>
<dimen name="d16">16.0px</dimen>
<dimen name="d17">17.0px</dimen>
<dimen name="d18">18.0px</dimen>
<dimen name="d19">19.0px</dimen>
<dimen name="d20">20.0px</dimen>
<dimen name="d21">21.0px</dimen>
<dimen name="d22">22.0px</dimen>
<dimen name="d23">23.0px</dimen>
<dimen name="d24">24.0px</dimen>
...省略
</resources>

你可能感兴趣的:(Android,Utils,android,广播监听网络)