android 屏蔽wifi功能,Android:若wifi未开启给出相应弹框
預(yù)期效果
用戶正在與本應(yīng)用程序界面交互時(shí),或本應(yīng)用程序退到后臺(tái)時(shí),只要檢測(cè)wifi被關(guān)閉,都能彈出相應(yīng)對(duì)話框提示用戶“請(qǐng)打開wifi”,用戶必須點(diǎn)擊對(duì)話框中的確定按鈕跳轉(zhuǎn)到“網(wǎng)絡(luò)設(shè)置界面”。
請(qǐng)打開wifi.png
思路
1. 監(jiān)聽wifi開關(guān)狀態(tài)改變廣播、在廣播接收器中進(jìn)行邏輯判斷
想要實(shí)現(xiàn)上述效果的話,存在這樣一個(gè)問(wèn)題,因?yàn)楫?dāng)我們被通知需要打開wifi時(shí)可能處于任何一個(gè)界面,難道要為每個(gè)界面上都編寫一個(gè)彈出對(duì)話框的邏輯嗎?
不能呀!借助廣播的知識(shí),當(dāng)wifi開關(guān)狀態(tài)改變時(shí)會(huì)收到一條系統(tǒng)廣播,這條廣播就是用于進(jìn)行處理彈框邏輯的通知。所以“請(qǐng)打開wifi”彈框的邏輯寫在接收這條廣播的廣播接收器中。這樣該邏輯判斷不會(huì)依附于任何界面,不管在程序的任何地方,只要發(fā)出這樣一條廣播,就可以完成這個(gè)邏輯判斷。
系統(tǒng)廣播WifiManager.WIFI_STATE_CHANGED_ACTION,通過(guò)監(jiān)聽wifi開關(guān)狀態(tài)變化的廣播,
wifi開關(guān)狀態(tài)
WifiManager.WIFI_STATE_DISABLED ; (1) 關(guān)閉
WifiManager..WIFI_STATE_ENABLED ; (3) 打開
WifiManager..WIFI_STATE_DISABLING ;(0) 關(guān)閉中
WifiManager..WIFI_STATE_ENABLING ; (2) 打開中
WifiManager..WIFI_STATE_UNKONW ; (4) 未知
2. 廣播接收器注冊(cè)、取消注冊(cè)的地方
一般廣播接收器是在onResume()中注冊(cè),onPause()中取消注冊(cè)。從Activity的生命周期特點(diǎn)可知,onResume()方法被回調(diào)后Activity可與用戶交互,onPause()被回調(diào)后Activity不可與用戶交互。這樣的做法:保證了始終只有棧頂?shù)幕顒?dòng)才能接收到廣播,非棧頂?shù)幕顒?dòng)不應(yīng)該也沒(méi)必要去接收這條廣播,當(dāng)一個(gè)活動(dòng)失去棧頂位置時(shí)自動(dòng)取消廣播接收器的注冊(cè)。
但現(xiàn)在,我們的需求是,在Activity可與用戶交互,或不可與用戶交互時(shí)都可彈框提示用戶。故選擇在onCreate()中注冊(cè)廣播接收器(Activity始終可以接收這條廣播),在onDestroy()中取消注冊(cè)。
3.廣播接收器onReceive()方法中的邏輯
onReceive()方法中的邏輯.png
public class WifiListenerReceiver extends BroadcastReceiver {
public static final String MY_WIFI_BROADCAST="MY_WIFI_BROADCAST";
@Override
public void onReceive(Context context, Intent intent) {
String action=intent.getAction();
if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action) || Constant.WIFI_LISTENER_ACTION.equals(action)) {
int wifiState = DeviceInfoUtil.getWifiState(context);
Log.e("LoginActivity", "收到wifi廣播"+wifiState);
switch (wifiState) {
case WifiManager.WIFI_STATE_DISABLED:
case WifiManager.WIFI_STATE_DISABLING:
case WifiManager.WIFI_STATE_UNKNOWN:
/*
* wifi處于關(guān)閉狀態(tài):若“請(qǐng)打開wifi對(duì)話框”正在顯示,將該對(duì)話框顯示在前臺(tái);
* 未正在顯示:創(chuàng)建新的并顯示
*/
Intent intent1 = new Intent(context, OpenWifiActivity.class);
// 以SingleTask的模式啟動(dòng)(棧內(nèi)復(fù)用)
intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent1);
break;
case WifiManager.WIFI_STATE_ENABLED:
case WifiManager.WIFI_STATE_ENABLING:
/*
* wifi處于開啟狀態(tài):若“請(qǐng)打開wifi對(duì)話框”正在顯示,將該對(duì)話框關(guān)閉;
* 未正在顯示:Nothing
*/
OpenWifiActivityCollector.finishAll();
break;
}
}
}
}
3.1“請(qǐng)打開wifi”框的制作:用Activity做成Dialog的樣式
將OpenWifiActivity主題設(shè)置為
@android:color/transparent 設(shè)置dialog的背景,此處為系統(tǒng)給定的透明值
@null Dialog的windowFrame框?yàn)闊o(wú)
true 是否顯示標(biāo)題
true 是否浮現(xiàn)在activity之上
true 是否半透明
@null 是否有覆蓋
@android:style/Animation.Dialog 設(shè)置Activity出現(xiàn)方式
true 背景是否模糊顯示
3.2可能會(huì)出現(xiàn):連續(xù)彈出多個(gè)“請(qǐng)打開wifi”框
此處是將Activity做成Dialog的效果顯示出來(lái)。故將Activity的啟動(dòng)模式設(shè)置成SingleTask,就可保證棧內(nèi)復(fù)用,始終只有一個(gè)彈框
android:name=".module.wifi.OpenWifiActivity"
android:theme="@style/FDialogStyle"
android:launchMode="singleTask">
3.3會(huì)出現(xiàn)的情況:“請(qǐng)打開wifi”框正在顯示,通過(guò)通知欄打開wifi,但該框未被銷毀
用一個(gè)專門的集合類對(duì)所有打開的OpenWifiActivity實(shí)例進(jìn)行存儲(chǔ)。當(dāng)需要關(guān)閉OpenWifiActivity時(shí),finish掉集合中保存的該活動(dòng)的所有實(shí)例
public class OpenWifiActivity extends Activity {
@BindView(R.id.btn_openwifi_sure)
Button btn_sure;
@BindView(R.id.btn_openwifi_cancel)
Button btn_cancel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_openwifi);
KnifeKit.bind(this);
// 加入到ActivityCollector中
OpenWifiActivityCollector.addActivity(this);
btn_sure.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DeviceInfoUtil.openWifiSetting(getApplicationContext());
finish();
}
});
btn_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
// 從管理類中移除實(shí)例
OpenWifiActivityCollector.removeActivity(this);
}
}
public class OpenWifiActivityCollector {
public static List sActivities = new ArrayList<>();
public static void addActivity(Activity activity) {
sActivities.add(activity);
}
public static void removeActivity(Activity activity) {
sActivities.remove(activity);
}
public static void finishAll() {
for (Activity activity : sActivities) {
if (!activity.isFinishing()) {
activity.finish();
}
}
}
}
代碼實(shí)現(xiàn)【下面給出相關(guān)代碼文件】
1.base
base.png
MyBaseActivity
public abstract class MyBaseActivity extends AppCompatActivity implements MyUiCallback {
public static AlertDialog mAlertDialog;
protected Activity context;
private Unbinder unbinder;
// GPS檢測(cè)監(jiān)聽
private GPSListenerRecevicer receiver;
// Wifi狀態(tài)改變監(jiān)聽
private WifiListenerReceiver mWifiListenerReceiver;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e(getClass().getSimpleName(), "onCreate");
this.context = this;
beforeSetConentView(savedInstanceState);
if (getLayoutId() > 0) {
setContentView(getLayoutId());
unbinder = KnifeKit.bind(this);
}
setListener();
initData(savedInstanceState);
/*
* 在onCreate中注冊(cè)WiFi廣播監(jiān)聽,在onDestroy中取消注冊(cè)
* ylj
*/
registerWifiReceiver();
}
/**
* 注冊(cè)wifi狀態(tài)改變廣播接收器
*/
protected void registerWifiReceiver(){
mWifiListenerReceiver = new WifiListenerReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
filter.addAction(Constant.WIFI_LISTENER_ACTION);
registerReceiver(mWifiListenerReceiver, filter);
}
@Override
public void beforeSetConentView(Bundle savedInstanceState) {
}
@Override
public void setListener() {
}
@Override
protected void onResume() {
super.onResume();
Log.e(getClass().getSimpleName(), "onResume");
/*
*
* 在每次resume中,發(fā)送一條檢測(cè)wifi狀態(tài)的廣播
*/
sendCheckWifiStateBroadcast();
}
protected void sendCheckWifiStateBroadcast(){
Intent intent = new Intent();
intent.setAction(Constant.WIFI_LISTENER_ACTION);
sendBroadcast(intent);
Log.e(getClass().getSimpleName(), "發(fā)出MY_WIFI_BROADCAST廣播");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e(getClass().getSimpleName(), "onDestroy");
/*
* 取消注冊(cè)wifi狀態(tài)改變廣播接收器
* ylj
*/
unregisterWifiReceiver();
}
/**
* 取消注冊(cè)wifi狀態(tài)改變廣播接收器
* ylj
*/
private void unregisterWifiReceiver() {
if (mWifiListenerReceiver != null) {
unregisterGPSListener();
mWifiListenerReceiver = null;
}
}
}
MyUiCallback
/**
*
* author : 楊麗金
* time : 2018/03/23
* desc :
*
*/
public interface MyUiCallback {
// 在setContentView()之前調(diào)用的方法
void beforeSetConentView(Bundle savedInstanceState);
// 下面的三個(gè)方法都是在setContentView()之后調(diào)用的
void initData(Bundle savedInstanceState);
void setListener();
int getLayoutId();
}
2.wifi
wifi.png
OpenWifiActivity
public class OpenWifiActivity extends Activity {
@BindView(R.id.btn_openwifi_sure)
Button btn_sure;
@BindView(R.id.btn_openwifi_cancel)
Button btn_cancel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_openwifi);
KnifeKit.bind(this);
// 加入到ActivityCollector中
OpenWifiActivityCollector.addActivity(this);
btn_sure.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DeviceInfoUtil.openWifiSetting(getApplicationContext());
finish();
}
});
btn_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
// 從管理類中移除實(shí)例
OpenWifiActivityCollector.removeActivity(this);
}
}
OpenWifiActivityCollector
/**
*
* author : 楊麗金
* time : 2018/06/05
* desc : 管理OPENWiFiActivity實(shí)例
*
*/
public class OpenWifiActivityCollector {
public static List sActivities = new ArrayList<>();
public static void addActivity(Activity activity) {
sActivities.add(activity);
}
public static void removeActivity(Activity activity) {
sActivities.remove(activity);
}
public static void finishAll() {
for (Activity activity : sActivities) {
if (!activity.isFinishing()) {
activity.finish();
}
}
}
}
WifiListenerBroadcast
public class WifiListenerReceiver extends BroadcastReceiver {
public static final String MY_WIFI_BROADCAST="MY_WIFI_BROADCAST";
@Override
public void onReceive(Context context, Intent intent) {
String action=intent.getAction();
if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action) || Constant.WIFI_LISTENER_ACTION.equals(action)) {
int wifiState = DeviceInfoUtil.getWifiState(context);
Log.e("LoginActivity", "收到wifi廣播"+wifiState);
switch (wifiState) {
case WifiManager.WIFI_STATE_DISABLED:
case WifiManager.WIFI_STATE_DISABLING:
case WifiManager.WIFI_STATE_UNKNOWN:
/*
* wifi處于關(guān)閉狀態(tài):若“請(qǐng)打開wifi對(duì)話框”正在顯示,將該對(duì)話框顯示在前臺(tái);
* 未正在顯示:創(chuàng)建新的并顯示
*/
Intent intent1 = new Intent(context, OpenWifiActivity.class);
// 以SingleTask的模式啟動(dòng)(棧內(nèi)復(fù)用)
intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent1);
break;
case WifiManager.WIFI_STATE_ENABLED:
case WifiManager.WIFI_STATE_ENABLING:
/*
* wifi處于開啟狀態(tài):若“請(qǐng)打開wifi對(duì)話框”正在顯示,將該對(duì)話框關(guān)閉;
* 未正在顯示:Nothing
*/
OpenWifiActivityCollector.finishAll();
break;
}
}
}
}
參考文獻(xiàn)
總結(jié)
以上是生活随笔為你收集整理的android 屏蔽wifi功能,Android:若wifi未开启给出相应弹框的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: EndNote文献管理(二)基操勿六
- 下一篇: Win 10 GTX 960下 Pyto