faywong 发布的文章

今天由测试同学反映两款手机(红米,三星GS4,均搭载Android 4.2.2)存在WebApp中收到回调后软键盘自动收起。

经过一段时间的研究,发现在Android 4.2.2上WebView.loadUrl()被调用后WebView会认为新的一个页面即将打开,而将软键盘收起。

android填坑之旅还要继续……

源代码如下(以android 4.0.4为例):

```java
public synchronized String getUserAgentString() {
if (DESKTOP_USERAGENT.equals(mUserAgent) ||
IPHONE_USERAGENT.equals(mUserAgent) ||
!mUseDefaultUserAgent) {
return mUserAgent;
}

boolean doPostSync = false;
synchronized(sLockForLocaleSettings) {
Locale currentLocale = Locale.getDefault();
if (!sLocale.equals(currentLocale)) {
sLocale = currentLocale;
mUserAgent = getCurrentUserAgent();
mAcceptLanguage = getCurrentAcceptLanguage();
doPostSync = true;
}
}
if (doPostSync) {
postSync();
}
return mUserAgent;
}
```
其中后半段代码用于将当前locale设定同步到生成的UA中。所以该方法是有副作用的。

在一个使用了WebView的Activity里实例化完成和系统Configuration改变后都需要调用一次getUserAgentString()来让WebView的UA(前提是不要设置自己的UA,即没有针对此WebView调用过setUserAgentString)中locale分量与系统的设定保持一致。以免在访问多语言网站时出现适配问题。

一个非常适合用于对用户进行第一次使用进行指导的库ShowcaseView,截图示例如下:

![showcase view 1](/uploads/2015-02-01-01.png)

![showcase view 2](/uploads/2015-02-01-02.png)

下面给出一个实例,需要瞄定一个特殊的View(id为R.id.answers),在其上显示一个ShowCaseView:

```java
new ShowcaseView.Builder(getActivity()).setTarget(new ActionItemTarget(getActivity(), R.id.answers))
//Here is where you supply the id of the action bar item you want to display
.setContentTitle("Title").setContentText("Description").hideOnTouchOutside().build();
```

项目主页位于:https://github.com/amlcurran/ShowcaseView,从其commit数和release数来看,应该非常靠谱。

接下来打算在项目中使用起来,后续补上使用感受。

android 5.0上WebView开始默认阻止Mixed Content,且不再接受第三方的cookie。所以为了你以往的WebApp里边的内容可以正常访问,需要使用WebSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW) 和CookieManager.setAcceptThirdPartyCookies({your_webview}, true) 来放开这一限制。

当然最好是让你的页面不再存在mixed content,不再依赖第三方cookie最为完美。

在android L上测试反馈使用WebApp时会出现如下crash:
```bash
F/libc ( 7555): Fatal signal 6 (SIGABRT) in tid 12577 (RenderThread)

I/DEBUG ( 182): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

I/DEBUG ( 182): Build fingerprint: 'google/hammerhead/hammerhead:L/LPV79/1236599:user/release-keys'

I/DEBUG ( 182): Revision: '11'

I/DEBUG ( 182): pid: 7555, tid: 12577, name: RenderThread >>> com.eg.android.AlipayGphone <<<

I/DEBUG ( 182): signal 6 (SIGABRT), code 0 (SI_USER), fault addr --------
```
后来研究发现:

https://code.google.com/p/android-developer-preview/issues/detail?can=2&start=0&num=100&q=&colspec=ID%20Type%20Status%20Owner%20Summary&groupby=&sort=&id=950

上有人报告同一问题。

LPV79这个build为developer preview version.存在一些问题。

后来在正式版本中验证同一问题,不可复现。