- 浏览: 926472 次
- 性别:
- 来自: 上海
最新评论
-
liu149339750:
我勒个去,搜到你的博客了,关注!
Android make脚本简记 -
ihopethatwell:
楼主,这个修改时间有个问题,退出修改界面就不保存设置的时间了, ...
Android中如何修改系统时间(应用程序获得系统权限) -
flyar520:
你好...我也遇到屏幕半屏刷成黑屏的问题...但是我的时在开机 ...
Android横屏状态下返回到壁纸界面屏幕刷新问题 -
flyar520:
你好...我也遇到屏幕半屏刷成黑屏的问题...但是我的时在开机 ...
Android横屏状态下返回到壁纸界面屏幕刷新问题 -
taowayi:
推荐android一键反编译神器 apkdec
Android apk反编译
业务需求:有些链接需要使用CMWAP
接入点才能成功访问, 我们的浏览器必须能够自动切换
CNNET, CMWAP.
分析:调用浏览器的时候在Intent
中传递一个参数, 用于标示接入点需要。 我们的浏览器需要处理
3
种情况, 第一是参数为
cmwap
时, 切换成
cmwap
; 第二是参数为
cmnet
或者从桌面上的浏览器图标点击, 第一次启动浏览器时, 切换成
cmnet;
第三是打开一个链接, 没有参数时, 不做切换, 直接使用当前接入点。 如果已经打开浏览器, 并且切换成
cmwap
, 无论后来如何去手动设置接入点, 当点击浏览器里面的链接, 或者输入其他地址进行访问时, 必须能够再次切换成
wap.
已经打开为
cmnet
浏览器同理。 在需要切换的时候, 必须等到切换完成, 新的接入点成功连接上以后才能开始数据的载入。
改动: 1.
接入点切换方法
/*
* change current network connection to cmwap if it's not. added by Qkf36923
*/
public int forceAPNConnection(String apnName) {
//validate apn name.
if (apnName == null || apnName.equals("") ||
(!("cmwap".equals(apnName)||"cmnet".equals(apnName)))) {
return 0;
}
NetworkInfo info = conManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (!info.isAvailable()) {
return 0;
}
info = conManager.getActiveNetworkInfo();
String tempAPN = info == null ? "" : info.getExtraInfo();
//if current apn is not cmwap, we have to switch to cmwap.
if (!apnName.equals(tempAPN)) {
if (mNChangeReceiver != null) {
this.unregisterReceiver(mNChangeReceiver);
}
mNChangeReceiver = new NetworkChangeReceiver();
//register receiver for wap network connection.
IntentFilter upIntentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(mNChangeReceiver, upIntentFilter);
updateCurrentAPN(getContentResolver(), apnName);
return 1;
}
return 0;
}
在onCreate
和
onNewIntent
的方法中去判断是否需要切换, 以及设置一些标示。
public void onCreate(Bundle icicle) {
…
if (!mTabControl.restoreState(icicle)) {
// clear up the thumbnail directory if we can't restore the state as
// none of the files in the directory are referenced any more.
new ClearThumbnails().execute(
mTabControl.getThumbnailDir().listFiles());
// there is no quit on Android. But if we can't restore the state,
// we can treat it as a new Browser, remove the old session cookies.
CookieManager.getInstance().removeSessionCookie();
final Intent intent = getIntent();
final Bundle extra = intent.getExtras();
// Create an initial tab.
// If the intent is ACTION_VIEW and data is not null, the Browser is
// invoked to view the content by another application. In this case,
// the tab will be close when exit.
UrlData urlData = getUrlDataFromIntent(intent, null);
/*
* when request connection is specified to cmwap, we have to change current APN
* added by Qkf36923, 20110113
*/
String requestConType = intent.getStringExtra("data_connection");
if (requestConType == null) {
//if launched from launcher, it's treated as WWW browser
if (intent.getAction().equals(Intent.ACTION_MAIN)) {
dataConnectionType = "cmnet";
} else {
//get current APN type and set it to browser
if (info != null) {
String tempAPN = info.getExtraInfo();
dataConnectionType = tempAPN;
}
}
if (forceAPNConnection(dataConnectionType) == 1) {
isSwitchingToNet = true;
}
} else if ("cmwap".equals(requestConType)
&& info != null && (!"cmwap".equals(info.getExtraInfo()))) {
dataConnectionType = "cmwap";
if (forceAPNConnection(dataConnectionType) == 1) {
isSwitchingToWap = true;
}
}
下面会去调用loadUrl
和
loadDataIn
方法, 需要做相应修改:
private void loadUrl(WebView view, String url) {
updateTitleBarForNewLoad(view, url);
/**if url is navigation page, we can load it from local directly.
* Added by QuYueting 20110310. Start.
*/
if (mNChangeReceiver != null) {
if (BrowserSettings.NAVIGATION_PAGE_URL.equals(url)
|| (url != null && url.startsWith("about:"))) {
autoLoad = true;
view.loadUrl(url);
} else {
autoLoad = false;
mWebView = view;
tempUrl = url;
}
} else {
view.loadUrl(url);
}
/**Added by QuYueting 20110310. End**/
}
LoadUrlDataIn方法同时也会被
onNewIntent
调用。
private void loadUrlDataIn(Tab t, UrlData data) {
//if it's not called from OnCreate and it's switching to wap, postpone data loading. added by Qkf36923
updateTitleBarForNewLoad(t.getWebView(), data.mUrl);
/**if no need to switch or home page is set as empty, we should load navigation page instantly.
* Added by QuYueting 20110310. Start**/
if (mNChangeReceiver == null ||
(data.isEmpty() && mSettings.getHomePage().equals(""))
|| (BrowserSettings.NAVIGATION_PAGE_URL.equals(data.mUrl))
|| (data.mUrl != null && data.mUrl.startsWith("about:"))) {
data.loadIn(t);
} else {
mt = t;
mUrlData = data;
}
/**if no need to switch or home page is set as empty, we should load navigation page instantly.
* Added by QuYueting 20110310. End**/
}
再看对OnNewIntent
的修改
protected void onNewIntent(Intent intent) {
…
UrlData urlData = getUrlDataFromIntent(intent, current);
//get request connection type, if current connection type is cmwap, it indicates
//this is monternet browser, we won't change APN any more.
String requestConType = intent.getStringExtra("data_connection");
if (requestConType == null) {
//get current APN, set browser connection type.
NetworkInfo network = conManager.getActiveNetworkInfo();
if (network != null && network.isAvailable()) {
dataConnectionType = network.getExtraInfo();
}
} else if ("cmwap".equals(requestConType) || "cmnet".equals(requestConType)){
dataConnectionType = requestConType;
if (forceAPNConnection(dataConnectionType) == 1) {
if ("cmwap".equals(requestConType)) {
isSwitchingToWap = true;
}
if ("cmnet".equals(requestConType)) {
isSwitchingToNet = true;
}
}
}
fromNewIntent = true;
fromNewIntent用来标志是否是第一次创建浏览器, 这在连接上目标
APN
网络以后如何打开页面有关系。
下面是NetworkChangeReceiver
的定义
/*
* receiver for observing network connection change, added by Qkf36923
*/
public class NetworkChangeReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
//NetworkInfo info = conManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
NetworkInfo info = intent.getParcelableExtra(
ConnectivityManager.EXTRA_NETWORK_INFO);
String apn = info.getExtraInfo();
if (((isSwitchingToWap && "cmwap".equals(apn))
|| (isSwitchingToNet && "cmnet".equals(apn)))
&& info.isConnected() && info.isAvailable()) {
/*
* apn change message is sent out more than once during a second, but it
* only happens once practically.
*/
if(mNChangeReceiver != null) {
WebView.disablePlatformNotifications();
WebView.enablePlatformNotifications();
if (fromNewIntent) {
loadUrlOnNewIntent();
} else {
if (!autoLoad) {
loadUrlOnCreate();
autoLoad = true;
}
}
BrowserActivity.this.unregisterReceiver(mNChangeReceiver);
mNChangeReceiver = null;
Message message = connectionHandler.obtainMessage(0);
connectionHandler.sendMessageDelayed(message, 300);
}
}
}
}
}
//load data when on Create. added by Qkf36923
private void loadUrlOnCreate() {
if (mUrlData.isEmpty()) {
if (mWebView != null) {
mWebView.loadUrl(tempUrl);
mWebView = null;
}
} else {
if (mUrlData != null) {
mUrlData.loadIn(mt);
mUrlData = null;
}
}
}
private void loadUrlOnNewIntent() {
//updateTitleBarForNewLoad(mt.getWebView(), mUrlData.mUrl);
mUrlData.loadIn(mt);
}
//new handler for setting wap switching flag. added by Qkf36923
Handler connectionHandler = new Handler() {
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (receivedByStateListener) {
receivedByStateListener = false;
resetSwitchingFlag();
} else {
Message message = connectionHandler.obtainMessage(0);
connectionHandler.sendMessageDelayed(message, 300);
}
}
};
connectionHandler用于发送消息重置
isSwitchingToWap
和
isSwitchingToNet
标志。 因为本来浏览器中有一个网络监听器, 用于弹出网络是否存在的提示框。 我们进行接入点切换时网络会先断掉, 会被那个监听器收到, 从而弹出网络不存在的提示框, 这样用户体验不好,我们需要在切换的时候屏蔽掉。 所以做了以下修改:
mNetworkStateIntentReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(
ConnectivityManager.CONNECTIVITY_ACTION)) {…
if (!isSwitchingToWap && !isSwitchingToNet) {
onNetworkToggle(info.isAvailable());
} else {
这样当网络连接成功后, 我们需要把标志再重置回去。
发表评论
-
Android JNI 编程常见小问题
2015-09-08 11:31 1228extern "C" { jint Jav ... -
Android ServiceManager注册自定义service
2015-08-19 09:53 4174当我们要使用android的系统服务时,一般都是使用Conte ... -
Android ALMP 架设web服务器配置
2014-10-08 18:48 1498随着信息时代的发展,智能手机已经越来越普及。下面本文将带大家把 ... -
Android UiAutomator 自动化测试
2014-07-04 17:39 10035一、一个BUG引发的问题 ... -
Android XP MTP支持
2014-03-18 16:41 2336家里电脑是win7,连上直接豌豆荚装驱动就好了。但单位的XP却 ... -
Android Launcher2 icon大小修改
2012-08-16 19:12 6070不同分辨率、不同屏幕的不同设备,android 原生的Laun ... -
android 浏览器全屏显示
2012-04-16 16:40 4922业务需求:浏览器设置中支持全屏显示的功能。 分析:只需要在 ... -
Android MD5校验码的生成与算法实现
2012-03-05 15:05 20388在Java中,java.security.MessageDi ... -
Android View的xml属性
2012-02-27 13:25 2836java.lang.Object andro ... -
Android Gallery3D源码学习总结(三)——Cache缓存及数据处理流程
2011-12-29 11:04 4703第一,在应用程序中有三个线程存在:主线程(随activity的 ... -
Android Gallery3d源码学习总结(二)——绘制流程drawThumbnails
2011-12-29 11:02 2946此函数控制相册表格页 ... -
Android Gallery 3D 特效精华
2011-12-29 10:45 5338Android Gallery 3D 特效精华 一、布 ... -
Android Gallery3d源码学习总结(一)——绘制流程drawFocusItems
2011-12-29 10:42 2748显示单张图片相关的输入变量 int selecte ... -
Android:AppWidget,PendingIntent,RemoteViews用法
2011-11-25 10:09 5931什么是AppWidget?AppWidget就是我们平常在 ... -
Android软件汉化/精简/去广告教程
2011-08-23 12:32 2939前言: 现在随处都可以找到功能强大的汉化工具,操作简 ... -
Android ListView页眉页脚效果
2011-07-06 14:07 2686大家都知道,在我们调用ListView的addFooterVi ... -
Android 获取设备信息
2011-06-22 21:09 7975)android 获取设备型号、OS版本号: imp ... -
Android 应用安装设置
2011-05-31 16:18 1915应用程序的默认安装位置以及是否可移动取决于该程序的开发者的配置 ... -
Android Activity去除标题栏和状态栏
2011-05-31 13:10 40490一、在代码中设置 public void onCreate( ... -
Android最佳实践之响应灵敏性
2011-05-16 14:44 1368Android最佳实践之响应灵敏性 可能会存在这样 ...
相关推荐
"Android APN切换程序"是一个专门针对Android系统的应用,它允许用户方便快捷地在不同的APN设置之间切换,无需手动进入系统设置进行复杂的配置。这个程序特别适用于那些需要频繁更改APN设置的用户,例如移动网络调试...
Android 手机 APN 设置 APN(Access Point Name)是移动网络中的一个重要概念,它是指移动网络中的一个访问点名称,用于标识移动网络中的一个访问点。Android 手机中的 APN 设置是指在 Android 手机中设置移动网络...
在Android系统中,APN(Access Point Name)是用于设置移动数据网络连接的关键参数,它定义了设备如何连接到互联网,通常包括网络运营商、数据服务类型等信息。本模块主要探讨的是如何在Android应用程序中通过代码来...
Android 获取 APN 列表的系统信息 Android 系统中对于 APN 的网络 API 没有公开,但是我们可以通过阅读源代码,然后进行数据库操作,系统会自动监听数据库的变化,从而实现开启或者关闭 APN。 APN(Access Point ...
Android 全面解析 APN APN(Access Point Name)是 GPRS 背bone 中的一个参考点,指向一个 GGSN(Gateway GPRS Support Node)。GGSN 是一个核心网络设备,负责将用户的数据流量转发到互联网上。APN 是一个字符串,...
Android APN 开发流程分析 Android APN 开发流程分析是指 Android 操作系统中数据连接的实现过程,主要涉及到数据连接的建立、维护和管理。以下是 Android APN 开发流程分析的关键知识点: 1. 数据连接流程分析 ...
### Android的APN开发源码分析 #### 一、Android数据连接原理 Android的数据连接机制主要是基于PPP(Point-to-Point Protocol)的方式实现的。PPP协议是一种广泛使用的串行链路通信协议,它允许用户通过拨号或其他...
在Android系统中,APN(Access Point Name)是网络连接的关键配置,用于定义设备如何接入互联网,特别是通过移动数据。APN包含了网络提供商的名称、数据类型、用户名、密码等信息,这些信息决定了手机如何通过运营商...
本项目中,我们关注的重点是如何在Android系统中设置APN,并且实现APN节点的切换,这对于网络服务的提供,特别是在企业级项目中,具有重要的实用价值。 首先,我们要理解APN的作用。APN包含了运营商信息、数据类型...
### Android APN开发流程详解 #### 一、数据连接机制概览 Android设备的数据连接机制主要依赖于PPP(Point-to-Point Protocol)协议,这是一套用于在点对点链路上进行数据传输的标准协议,适用于拨号电话、ISDN、X....
4. **切换APN**:在Android应用中,如果需要在`cmnet`和`cmwap`之间切换,可以通过修改当前激活的APN实现。`cmnet`通常用于高速互联网访问,而`cmwap`通常用于WAP浏览,它们的APN设置是不同的。通过调用`...
在Android系统中,APN(Access Point Name)是用于配置移动数据网络连接的重要设置,它定义了设备如何连接到互联网,特别是通过蜂窝数据。APN设置包括运营商、用户名、密码、代理服务器、端口等信息,对于使用特定...
### Android手机修改APN不保存解决办法 #### 一、APN基础知识介绍 APN(Access Point Name,接入点名称)是移动设备访问互联网时必须配置的重要参数之一。它不仅决定了用户通过何种接入方式访问互联网,而且还关联...
本教程将聚焦于创建一个GRRS/3G(GPRS/EDGE和3G网络)APN(Access Point Name,接入点名称)上网开关的Android小部件。这个小部件允许用户快速切换移动数据连接,对于经常需要控制数据流量的用户非常实用。 首先,...
由于Android的APN配置信息存储在一个文本文件中,通常命名为“apn.conf”或“apns-conf.xml”,而WP8系统则需要在系统设置内手动创建每个APN条目,这在APN数量众多的情况下非常不便。因此,有一个工具或方法能将...
国内运营商,中国移动,联通,电信,android上网APN
海卓APN切换开关_HIAPN_2[1].0.7.apk,能够实现手机APN的手动开关。
在Android系统中,获取地理位置信息是开发者经常遇到的需求。标题提到的“基于基站,APN,GPS,WiFi,Network 根据不同手机SIM卡获取经纬度”涉及了多种定位技术,每种都有其特性和应用场景。下面将详细介绍这些技术...
Android AT命令与APN开发流程分析
iphone手机软件。可以在cmwap和cmnet切换,方便 再更改