主要分为三步:①:创建网络出错的弹窗 ②:获取当前显示的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();
}
}
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>