转载自:https://blog.51cto.com/wangjinchan/4752142 感谢博主:一粒程序米 分享

一.前言
怎么对APP进行全局的网络监听呢?仿照微信的无网状态下弹出的提示,应该怎么做?

我是通过广播的方式通知是否有网络的,那么又如何实现全局监听呢?BaseaActivity,没错,就是它。我们在BaseaActivity使用EventBus订阅事件,具体的可以看一下代码。

二.实现方法
1.新建一个项目
2.增加NetUtils类

package com.example.app;import android.content.Context;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkInfo;
import android.os.Build;
import android.util.Log;
import android.widget.Toast;/***/public class NetUtils {/*** 判断网络是否连接** @param context* @return 网络是否连接Boolean(true|false)*/@SuppressWarnings({"ConstantConditions", "ForLoopReplaceableByForEach", "IfCanBeSwitch"})public static boolean isConnected(Context context) {StringBuilder str = null;//检测API是不是小于21,因为到了API21之后getNetworkInfo(int networkType)方法被弃用/***  在系统版本小于21之前,使用以下的方式获取当前网络状态:* 先利用Context对象获取ConnectivityManager对象,* 然后利用ConnectivityManager对象获取NetworkInfo对象,* 然后根据NetworkInfo对象的类型来返回不同的网络状态。* 有三种,移动,Wi-Fi,无网络连接。*/if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {//获得ConnectivityManager对象ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);//获取ConnectivityManager对象对应的NetworkInfo对象//获取WIFI连接的信息NetworkInfo wifiNetworkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);//获取移动数据连接的信息NetworkInfo dataNetworkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);if (wifiNetworkInfo.isConnected() && dataNetworkInfo.isConnected()) {Toast.makeText(context, "WIFI已连接,移动数据已连接", Toast.LENGTH_SHORT).show();Log.e("日志", "WIFI已连接,移动数据已连接");return true;} else if (wifiNetworkInfo.isConnected() && !dataNetworkInfo.isConnected()) {Toast.makeText(context, "WIFI已连接,移动数据已断开", Toast.LENGTH_SHORT).show();Log.e("日志", "WIFI已连接,移动数据已断开");return true;} else if (!wifiNetworkInfo.isConnected() && dataNetworkInfo.isConnected()) {Toast.makeText(context, "WIFI已断开,移动数据已连接", Toast.LENGTH_SHORT).show();Log.e("日志", "WIFI已断开,移动数据已连接");return true;} else {Toast.makeText(context, "WIFI已断开,移动数据已断开", Toast.LENGTH_SHORT).show();Log.e("日志", "WIFI已断开,移动数据已断开");return false;}} else {/***  在系统21及之后,获取网络连接状态的方式:利用ConnectivityManager对象获取* 所有的网络连接信息,然后遍历每个网络连接,获取相应的NetworkInfo,* 然后根据NetworkInfo对象的类型来返回不同的网络状态。*/if (str != null) {str.setLength(0);}//获得ConnectivityManager对象ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);//获取所有网络连接的信息Network[] networks = connMgr.getAllNetworks();//用于存放网络连接信息str = new StringBuilder();//通过循环将网络信息逐个取出来for (int i = 0; i < networks.length; i++) {//获取ConnectivityManager对象对应的NetworkInfo对象NetworkInfo networkInfo = connMgr.getNetworkInfo(networks[i]);str.append(networkInfo.getTypeName() + " connect is " + networkInfo.isConnected());}Log.e("日志", "sb.toString() : " + str.toString());if (str.toString().equals("WIFI connect is true")) {Toast.makeText(context, "WIFI已连接", Toast.LENGTH_SHORT).show();Log.e("日志", "WIFI已连接");return true;} else if (str.toString().equals("MOBILE connect is true")) {Toast.makeText(context, "移动数据已连接", Toast.LENGTH_SHORT).show();Log.e("日志", "移动数据已连接");return true;} else if (str.toString().equals("MOBILE connect is trueWIFI connect is true")|| str.toString().equals("WIFI connect is trueMOBILE connect is true")) {Toast.makeText(context, "WIFI已连接,移动数据已连接", Toast.LENGTH_SHORT).show();Log.e("日志", "WIFI已连接,移动数据已连接");return true;} else if (str.toString().equals("MOBILE connect is falseWIFI connect is true")|| str.toString().equals("WIFI connect is trueMOBILE connect is false")) {Toast.makeText(context, "WIFI已连接,移动数据已断开", Toast.LENGTH_SHORT).show();Log.e("日志", "WIFI已连接,移动数据已断开");return true;} else if (str.toString().equals("MOBILE connect is trueWIFI connect is false")|| str.toString().equals("WIFI connect is falseMOBILE connect is true")) {Toast.makeText(context, "WIFI已断开,移动数据已连接", Toast.LENGTH_SHORT).show();Log.e("日志", "WIFI已断开,移动数据已连接");return true;} else {Toast.makeText(context, "WIFI已断开,移动数据已断开", Toast.LENGTH_SHORT).show();Log.e("日志", "WIFI已断开,移动数据已断开");return false;}}}}

3.增加NetworkChangeEvent类

package com.example.app;
/***/
public class NetworkChangeEvent {public boolean isConnected; //是否存在网络public NetworkChangeEvent(boolean isConnected) {this.isConnected = isConnected;}
}

4.增加ActivityCollector类

package com.example.app;import android.app.Activity;
import java.util.ArrayList;
import java.util.List;
/***/
public class ActivityCollector {public static List<Activity> activities = new ArrayList<Activity>();/*** 用于向List中添加一个活动。** @param activity*/public static void addActivity(Activity activity) {activities.add(activity);}/*** 用于从List中移除活动。** @param activity*/public static void removeActivity(Activity activity) {activities.remove(activity);}/*** 用于将List中存储的活动全部都销毁掉。*/public static void finishAll() {for (Activity activity : activities) {if (!activity.isFinishing())activity.finish();}}}

5.增加广播接收器类 NetBroadcastReceiver

package com.example.app;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import org.greenrobot.eventbus.EventBus;
/***/
public class NetBroadcastReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {//在这里写上相关的处理代码,一般来说,不要此添加过多的逻辑或者是进行任何的耗时操作//因为广播接收器中是不允许开启多线程的,过久的操作就会出现报错//因此广播接收器更多的是扮演一种打开程序其他组件的角色,比如//创建一条状态栏通知,或者启动某个服务//**判断当前的网络连接状态是否可用*/boolean isConnected = NetUtils.isConnected(context);EventBus.getDefault().post(new NetworkChangeEvent(isConnected));}
}

6.默认所有继承 BaseActivity 的页面当网络状况变化活无网络时都会显示提示,所以这里新增BaseActivity 类,注意是类不是活动
package com.example.app;

import android.content.Context;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
/**

*/
public class BaseActivity extends AppCompatActivity {

protected Context mContext;
protected boolean mCheckNetWork = true; //默认检查网络状态
View mTipView;
WindowManager mWindowManager;
WindowManager.LayoutParams mLayoutParams;@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mContext = this;ActivityCollector.addActivity(this);// 将正在创建的活动添加到活动管理器里initTipView();//初始化提示ViewEventBus.getDefault().register(this);
}@Override
protected void onResume() {super.onResume();//在无网络情况下打开APP时,系统不会发送网络状况变更的Intent,需要自己手动检查hasNetWork(NetUtils.isConnected(mContext));
}@Override
protected void onPause() {super.onPause();
}@Override
protected void onDestroy() {super.onDestroy();ActivityCollector.removeActivity(this);// 将活动管理器里活动移除EventBus.getDefault().unregister(this);
}@Override
public void finish() {super.finish();//当提示View被动态添加后直接关闭页面会导致该View内存溢出,所以需要在finish时移除if (mTipView != null && mTipView.getParent() != null) {mWindowManager.removeView(mTipView);}
}@Subscribe(threadMode = ThreadMode.MAIN)
public void onNetworkChangeEvent(NetworkChangeEvent event) {hasNetWork(event.isConnected);
}private void hasNetWork(boolean has) {if (isCheckNetWork()) {if (has) {if (mTipView != null && mTipView.getParent() != null) {mWindowManager.removeView(mTipView);Log.e("日志", "有网络");Toast.makeText(mContext,"有网络",Toast.LENGTH_SHORT).show();}} else {if (mTipView.getParent() == null) {mWindowManager.addView(mTipView, mLayoutParams);Log.e("日志", "无网络");Toast.makeText(mContext,"无网络",Toast.LENGTH_SHORT).show();TextView textView=mTipView.findViewById(R.id.text);textView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent=new Intent(mContext, TipsActivity.class);startActivity(intent);}});}}}
}
    /*** 默认所有继承 BaseActivity 的页面当网络状况变化活无网络时都会显示提示,* 如果某个页面不需要网络状态提示,可以在该页面 onCreate* 方法中调用 setCheckNetWork(false) 即可。** @param checkNetWork*/public void setCheckNetWork(boolean checkNetWork) {mCheckNetWork = checkNetWork;}public boolean isCheckNetWork() {return mCheckNetWork;}private void initTipView() {LayoutInflater inflater = getLayoutInflater();mTipView = inflater.inflate(R.layout.layout_network_tip, null); //提示View布局mWindowManager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);mLayoutParams = new WindowManager.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT,WindowManager.LayoutParams.TYPE_APPLICATION,WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,//   | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, //注释掉可以进行事件监听PixelFormat.TRANSLUCENT);//使用非CENTER时,可以通过设置XY的值来改变View的位置mLayoutParams.gravity = Gravity.TOP;mLayoutParams.x = 0;mLayoutParams.y = 140;
//        mLayoutParams.gravity = Gravity.CENTER;}
}

7.新添加以下依赖

// EventBusimplementation 'org.greenrobot:eventbus:3.1.1'

8.在layout目录下新增layout_network_tip.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"xmlns:app="http://schemas.android.com/apk/res-auto"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:id="@+id/line"android:layout_width="match_parent"android:orientation="horizontal"android:background="#F3E7F5"android:layout_height="38dp"><ImageViewandroid:layout_gravity="center"android:layout_width="20sp"android:layout_height="20sp"android:layout_marginStart="15sp"android:src="@drawable/warnning"android:layout_marginLeft="15sp" /><TextViewandroid:id="@+id/text"android:layout_gravity="center"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="网络连接不可用,请检查网络设置"android:textColor="#7A6E6E"android:textSize="15sp"android:layout_marginLeft="15sp"tools:ignore="HardcodedText"/></LinearLayout></LinearLayout>

9.修改MainActivity.java

package com.example.app;import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;/***/
public class MainActivity extends BaseActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button btn_test=findViewById(R.id.btn_test);btn_test.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent=new Intent(MainActivity.this,TestActivity.class);startActivity(intent);}});}}

10.修改activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><androidx.appcompat.widget.Toolbarandroid:id="@+id/toolbar"android:layout_width="match_parent"android:layout_height="48dp"android:background="#ffffff"android:gravity="center"app:titleTextColor="#1d1d1d"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:text="测试APP"android:textColor="#1d1d1d"android:textSize="16sp" /></androidx.appcompat.widget.Toolbar><Buttonandroid:layout_marginTop="150dp"android:id="@+id/btn_test"android:gravity="center"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="测试别的活动"/></RelativeLayout>

11.新建TipsActivity,注意是activity,对应的xml是activity_tips.xml

package com.example.app;import android.os.Build;
import android.os.Bundle;
import android.view.View;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;/***/
public class TipsActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_tips);Toolbar toolbar=findViewById(R.id.toolbar);//设置小箭头if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {toolbar.setNavigationIcon(R.drawable.close);}//设置小箭头点击事件if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {toolbar.setNavigationOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {finish();}});}}
}

12.修改activity_tips.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".TipsActivity"><androidx.appcompat.widget.Toolbarandroid:id="@+id/toolbar"android:layout_width="match_parent"android:layout_height="48dp"android:background="#ffffff"android:gravity="center"app:titleTextColor="#1d1d1d"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:text="网络连接不可用"android:textColor="#1d1d1d"android:textSize="16sp" /></androidx.appcompat.widget.Toolbar><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginLeft="15sp"android:layout_marginRight="15sp"android:orientation="vertical"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#000000"android:textSize="25sp"android:text="未能连接到互联网"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#363535"android:text="您的设备未启动移动网络或无线局域网"/><TextViewandroid:layout_marginTop="15sp"android:layout_width="fill_parent"android:layout_height="0.5dp"android:layout_marginBottom="15sp"android:background="#000000"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#363535"android:text="如需要连接到互联网,请参考以下几点:"/><TextViewandroid:layout_marginLeft="30sp"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#363535"android:layout_marginTop="15sp"android:text="1.  检查手机中的无线局域网设置,查看是否有可接入的无线局域网信号。"/><TextViewandroid:layout_marginLeft="30sp"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#363535"android:text="2.  检查手机是否已接入移动网络,并且手机没有被停机。"/><TextViewandroid:layout_marginTop="15sp"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#363535"android:text="如果您已接入无线局域网:"/><TextViewandroid:layout_marginLeft="30sp"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="#363535"android:layout_marginTop="15sp"android:text="1.  请检查您所连接的无线局域网热点是否已接入互联网,或该热点是否已允许您的设备访问互联网。"/></LinearLayout></LinearLayout>

13.修改styles.xml parent改成"Theme.AppCompat.Light.NoActionBar"

<resources><!-- Base application theme. --><style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"><!-- Customize your theme here. --><item name="colorPrimary">@color/colorPrimary</item><item name="colorPrimaryDark">@color/colorPrimaryDark</item><item name="colorAccent">@color/colorAccent</item></style></resources>

13.在manifest添加以下权限

<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

14.在manifest注册NetBroadcastReceiver

            <category android:name="android.intent.category.DEFAULT" /></intent-filter></receiver>

完整的manifest如下:

<?xml version="1.0" encoding="utf-8"?>

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".TestActivity"></activity><activity android:name=".TipsActivity" /><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><receiverandroid:name=".NetBroadcastReceiver"android:enabled="true"android:exported="true"><intent-filter><action android:name="android.net.conn.CONNECTIVITY_CHANGE" /><category android:name="android.intent.category.DEFAULT" /></intent-filter></receiver>
</application>

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 三.总结 1.注意测试的时候不要忘记关掉网络,包括WiFi的和移动数据网络,不然就看不到效果了。 2.总结一下EVenBus的使用: EventBus是一种用于Android的事件发布-订阅总线,由GreenRobot开发,Gihub地址是:EventBus。它简化了应用程序内各个组件之间进行通信的复杂度,尤其是碎片之间进行通信的问题,可以避免由于使用广播通信而带来的诸多不便。

在这个项目里,我们定义了一个事件的封装对象------NetworkChangeEvent。在程序内部就使用该对象作为通信的信息。

public class NetworkChangeEvent {
public boolean isConnected; //是否存在网络

public NetworkChangeEvent(boolean isConnected) {this.isConnected = isConnected;
}

}
1.
2.
3.
4.
5.
6.
7.
然后我们通过广播接收器判断网络状态是否改变了,如果改变了就使用EventBus发布事件

最后,我们通过BaseActivity来EventBus注册监听事件

这样做的话,当手机没有网络的时候,广播接收器就会发布事件,然后只要是继承了BaseActivity的活动都会显示提示没有网络。

3.最后的最后,源码奉上。
源码:​ ​https://github.com/wangjinchan/NetState​

©著作权归作者所有:来自51CTO博客作者一粒程序米的原创作品,请联系作者获取转载授权,否则将追究法律责任
安卓APP在运行时对全局进行网络状态监听的实现
https://blog.51cto.com/wangjinchan/4752142

安卓APP在运行时对全局进行网络状态监听的实现相关推荐

  1. Android 11.0 系统默认授予app安装权限(去掉app首次运行时权限授权弹窗)

    目录 1.概述 2.系统默认授予app安装权限去掉app首次运行时权限授权弹窗功能分析

  2. android wifi定位不了,h5网页使用高德地图定位正常,网页嵌入安卓app后wifi定位正常,4g网络无法定位?...

    问题描述 h5网页使用高德地图定位正常,网页嵌入安卓app后wifi定位正常,4g网络无法定位 问题出现的环境背景及自己尝试过哪些方法 h5网页手机浏览器打开没有问题,嵌入app后打包,安卓9.0系统 ...

  3. Android底层隐私数据,100%安卓APP都在获取用户隐私,网络隐私进入深入区

    原标题:100%安卓APP都在获取用户隐私,网络隐私进入深入区 (图片来源:全景视觉) 经济观察网 记者 任晓宁"很多时候用户对自己的隐私是麻木的,"腾讯社会研究中心总监王晓冰去年 ...

  4. 安卓传感器全解:注册、注销传感器、监听传感器,距离传感器、方向传感器、陀螺仪、加速计、磁场、气压传感器

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓传感器全解:注册.注销传感器.监听传感器.距离传感器.方向传感器.陀螺仪.加速计.磁场.气压传感器. 注册.注销.监听传感器 1.自定义传感器监听 ...

  5. 安卓6.0运行时权限处理

    由于一直以来公司做的项目一直使用的目标版本是API22[安卓5.0],但是在API22上面会有很多的功能不能使用,例如软件管理权限,同时目前推荐的目标版本是API25也就是Android7.0,所以在 ...

  6. ios获取新数据要不要关_100%安卓APP都在获取用户隐私,网络隐私进入深入区

    (图片来源:全景视觉) 经济观察网 记者 任晓宁 "很多时候用户对自己的隐私是麻木的,"腾讯社会研究中心总监王晓冰去年开始与DCCI一块合作做互联网数据隐私报告,今年1月底的报告发 ...

  7. 安卓电话和网络开发全解:电话硬件检测、电话服务信息、sim信息、网络服务信息、数据连接和数据传输信息、电话状态监听

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓电话和网络开发全解,包括电话硬件检测.电话服务信息.sim信息.网络服务信息.数据连接和数据传输信息.通过phone state listener ...

  8. android新闻app实现下拉刷新,Android实例_当监听类有数据更新时下拉刷新

    之前两篇文章分别介绍了OnScrollListener的实现和ContentProvider监听数据的变化,下面我们就结合者两个知识点实现一个小项目 项目需求 使用当ContentProvider监听 ...

  9. 使用Java实现全局键盘和鼠标监听

    文章目录 Global Keyboard Listener Global Mouse Listener Global Mouse Wheel Listener 普通的Java Swing组件都是必须要 ...

最新文章

  1. AI 芯片的分类及技术
  2. kettle 表输入 显示重复_表输入插件详解
  3. Day1-dns Extension
  4. 精心整理 25 个 Python 文本处理案例,收藏!
  5. kaggle共享单车数据分析及预测(随机森林)
  6. Unity List的拷贝
  7. MongoDB,无模式文档型数据库简介
  8. Java 线程池学习
  9. 图片弹幕蒙版java实现_通过css3实现蒙版弹幕
  10. SuperMap GIS 10i大数据GIS 技术白皮书
  11. jQuery 身份证验证
  12. mysql的skip-slave-start参数
  13. pytorch中的transforms介绍
  14. element-ui组件修改数据不发生改变问题
  15. 人工智能实践作业-修道士和野人过河问题
  16. OCR文本识别网络SAR的学习
  17. 理想低通滤波器、Butterworth滤波器和高斯滤波器(matlab)
  18. Java几种定时发送消息
  19. 比较全的sql表关联图
  20. STM32CubeMX:ETR外部脉冲计数器

热门文章

  1. js 校验字符串是否为数字和字母组合
  2. 【微信技术-微信小程序】------- 渐进式骨架屏(加载流)(第二篇)
  3. python 微博自动点赞_用 Python 自动定时发微博
  4. php 拼团_详解在微信公众平台里实现微信拼团功能的步骤
  5. 信息安全工程第四章网络安全体系与网络安全模型要点小结
  6. 智能客服工单系统与工单管理系统的区别
  7. C语言斐波那切数列数列求和
  8. 【R语言】他说每个生存曲线一定要看到p值,不能0.05,0.01,0.001
  9. windows11 mars xlog解密环境配置
  10. 本人新开的一个人才网站,玉环人力网