在加入谷歌开机向导的情况下,使wifi关闭
2015-07-31 14:08
477 查看
以下是AMX运营商对wifi需求的描述:
Wifi的默认值需要设为关闭
但是项目引入了google的设置向导,其包名为com.google.android.setupwizard,在设置向导中,wifi会被默认打开.
解决思路:
首次接触到该问题,想到的方法是,因为这个设置向导会进入wifisetting模块,此部分我们是有代码的,于是做了一个简单的规避方案:在用户点击跳过wifi连接时,把wifi给关闭。
但是后来运营商对此有补充说明,需要在任何情况下,开机完成后都要使wifi默认为关闭。
于是抓取了一次开机log,可以查看到,当setupwizard完成后,会发出以下的intent:
01-01 00:01:53.050 V/PackageManager( 748): Sending package changed:package=com.google.android.setupwizard components=[com.google.android.setupwizard.SetupWizardActivity,com.google.android.setupwizard.LoginAccountsMissingReceiver,com.google.android.setupwizard.GservicesChangedReceiver,com.google.android.setupwizard.MobileConnectivityChangeReceiver,com.google.android.setupwizard.MobileDataActivity$HfaChangeReceiver]
其action类型为ACTION_PACKAGE_CHANGE
然后就是设计如何接收到该intent后关闭wifi了
从抓取的log中,可以看到有以下几处已经写入了对package change事件的监听:
01-01 00:01:53.052V/ActivityManager(
748): Broadcast:Intent { act=android.intent.action.PACKAGE_CHANGED dat=package:com.google.android.setupwizardflg=0x4000010 (has extras) } ordered=false userid=0 callerApp=null
01-01 00:01:53.294 I/Launcher.Model(1573):
ACTION_PACKAGE_CHANGED : packageName:com.google.android.setupwizard isnot freeze!
由于launcher是第三方提供,因此还是决定加在ActivityManager中,相关接收和处理都在ActivityManagerService中进行,相关代码如下:
private final intbroadcastIntentLocked(ProcessRecord callerApp,
String callerPackage, Intent intent, String resolvedType,
IIntentReceiver resultTo, int resultCode, String resultData,
Bundle map, StringrequiredPermission, int appOp,
boolean ordered, boolean sticky, int callingPid, int callingUid,
int userId) {
……
returnActivityManager.BROADCAST_SUCCESS;
}
}
// begin
if(intent != null && intent.getAction() != null &&intent.getAction().equals(Intent.ACTION_PACKAGE_CHANGED)) {
String data =intent.getDataString();
if(data.endsWith("setupwizard")){
WifiManager mWifiManager =(WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
int state =mWifiManager.getWifiState();
if(state == WifiManager.WIFI_STATE_ENABLED)
mWifiManager.setWifiEnabled(false);
}
}
}
// end
……
请查看相关代码,并且需要注意,使用wifimanager需要引入android.net.wifi.WifiManager
此设计的思路是,通过设置向导结束时发出的intent,来启动此处的关闭wifi的动作。判断的条件主要为包名的判断以及wifi状态的判断。
经过验证,加入此处修改后,首次开机或者是恢复出厂设置,完成设置向导后wifi都会关闭。
Wifi的默认值需要设为关闭
但是项目引入了google的设置向导,其包名为com.google.android.setupwizard,在设置向导中,wifi会被默认打开.
解决思路:
首次接触到该问题,想到的方法是,因为这个设置向导会进入wifisetting模块,此部分我们是有代码的,于是做了一个简单的规避方案:在用户点击跳过wifi连接时,把wifi给关闭。
但是后来运营商对此有补充说明,需要在任何情况下,开机完成后都要使wifi默认为关闭。
于是抓取了一次开机log,可以查看到,当setupwizard完成后,会发出以下的intent:
01-01 00:01:53.050 V/PackageManager( 748): Sending package changed:package=com.google.android.setupwizard components=[com.google.android.setupwizard.SetupWizardActivity,com.google.android.setupwizard.LoginAccountsMissingReceiver,com.google.android.setupwizard.GservicesChangedReceiver,com.google.android.setupwizard.MobileConnectivityChangeReceiver,com.google.android.setupwizard.MobileDataActivity$HfaChangeReceiver]
其action类型为ACTION_PACKAGE_CHANGE
然后就是设计如何接收到该intent后关闭wifi了
从抓取的log中,可以看到有以下几处已经写入了对package change事件的监听:
01-01 00:01:53.052V/ActivityManager(
748): Broadcast:Intent { act=android.intent.action.PACKAGE_CHANGED dat=package:com.google.android.setupwizardflg=0x4000010 (has extras) } ordered=false userid=0 callerApp=null
01-01 00:01:53.294 I/Launcher.Model(1573):
ACTION_PACKAGE_CHANGED : packageName:com.google.android.setupwizard isnot freeze!
由于launcher是第三方提供,因此还是决定加在ActivityManager中,相关接收和处理都在ActivityManagerService中进行,相关代码如下:
private final intbroadcastIntentLocked(ProcessRecord callerApp,
String callerPackage, Intent intent, String resolvedType,
IIntentReceiver resultTo, int resultCode, String resultData,
Bundle map, StringrequiredPermission, int appOp,
boolean ordered, boolean sticky, int callingPid, int callingUid,
int userId) {
……
returnActivityManager.BROADCAST_SUCCESS;
}
}
// begin
if(intent != null && intent.getAction() != null &&intent.getAction().equals(Intent.ACTION_PACKAGE_CHANGED)) {
String data =intent.getDataString();
if(data.endsWith("setupwizard")){
WifiManager mWifiManager =(WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
int state =mWifiManager.getWifiState();
if(state == WifiManager.WIFI_STATE_ENABLED)
mWifiManager.setWifiEnabled(false);
}
}
}
// end
……
请查看相关代码,并且需要注意,使用wifimanager需要引入android.net.wifi.WifiManager
此设计的思路是,通过设置向导结束时发出的intent,来启动此处的关闭wifi的动作。判断的条件主要为包名的判断以及wifi状态的判断。
经过验证,加入此处修改后,首次开机或者是恢复出厂设置,完成设置向导后wifi都会关闭。
相关文章推荐
- 用jQuery Mobile做HTML5移动应用的三个优缺点
- 程序语言入门网站
- GIT 的一些功能点
- MD5算法介绍及jdk自带实现方式
- Oracle如何实现跨库查询
- Google CFO 的辞职信(引用)
- hadoop中partition浅析
- 排序方法的比较
- iPad适配tabBarController
- GIT 的一些功能点
- php学习笔记_1_文件格式
- log4j.properties配置详解
- Win10中virtualbox新建虚拟机不能设置64位系统解决
- poj-3026-Borg Maze-最小生成树
- 五指CRM快速部署
- Win10中virtualbox新建虚拟机不能设置64位系统解决
- UVA 1152 4 Values Whose Sum is Zero 和为0的4个值 (中途相遇)
- python threading模块2
- Spring源码学习-1.IOC-DefaultListableBeanFactory
- Struts2.3.1升级到Struts2.3.24相关问题