保存/恢复android webview的状态
Posted
技术标签:
【中文标题】保存/恢复android webview的状态【英文标题】:save/restore state of android webview 【发布时间】:2011-07-23 04:21:02 【问题描述】:我有一个简单的 webView 应用程序,它从我们的网站加载一个页面,其中包含我们的现场人员每天应该访问的位置和电话号码。它提供了一个挂钩来启动导航或拨打电话。从外部活动返回时,应用程序崩溃。点击手机的主页按钮,然后拨打电话,然后返回应用程序可以正常工作。
这是代码...
更新 2 - 不再崩溃,返回时 web 视图为空白
public class VSIMobile_WebView extends Activity
private static String PROVIDER="gps";
private WebView browser;
private LocationManager myLocationManager=null;
private TelephonyManager myTeleManager = null;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
browser=(WebView)findViewById(R.id.webview);
myLocationManager=(LocationManager)getSystemService(Context.LOCATION_SERVICE);
myTeleManager=(TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
browser.getSettings().setjavascriptEnabled(true);
browser.addJavascriptInterface(new Locater(), "locater");
browser.addJavascriptInterface(new JavaScriptInterface(this), "android");
if (savedInstanceState!=null)
browser.restoreState(savedInstanceState);
else
browser.loadUrl("http://zzz.com");
browser.setWebViewClient(new HelloWebViewClient());
public void onConfigurationChanged(Configuration newConfig)
super.onConfigurationChanged(newConfig);
@Override
public void onSaveInstanceState(Bundle outState)
//Toast.makeText(getBaseContext(), browser.getUrl(), Toast.LENGTH_LONG).show();
browser.saveState(outState);
@Override
protected void onRestoreInstanceState(Bundle state)
browser.restoreState(state);
super.onRestoreInstanceState(state);
//Toast.makeText(getBaseContext(), browser.getUrl(), Toast.LENGTH_LONG).show();
/* Did not work
public void onResume(Bundle inState)
browser.restoreState(inState);
super.onResume();
public void onPause(Bundle outState)
browser.saveState(outState);
super.onPause();
*/
@Override
public void onResume()
super.onResume();
@Override
public void onPause()
super.onPause();
【问题讨论】:
你能发布你的 logcat 输出吗? ***.com/questions/1002085/… 【参考方案1】:即使savedInstanceState != null
,您不应该设置myLocationManager
和其他实例变量吗?
恢复WebView
状态不会为您执行此操作,并且您的应用在尝试解除对其中一个状态的引用时可能会崩溃,从而为您提供NullPointerException
。
【讨论】:
现在可以在不崩溃的情况下返回应用程序,但只是得到一个带有应用程序标题的空白 webbview。另外,无法在模拟器中重现。 最重要的是,我设法在我的机器上搞砸了 eclipse,现在无法打开模拟器。今天早上正在重新安装。【参考方案2】:除了上面的代码之外,启用以下属性就像一个魅力:)
android:launchMode="singleInstance"
android:alwaysRetainTaskState="true"
AndroidManifest.xml 中包含 WebView 的每个活动都为我工作。尽管这是一个笼统的答案,但可以解决您和许多其他此类人遇到此问题。
【讨论】:
【参考方案3】:在恢复您的应用后,应用 locationManager.getLastKnownLocation
以获取最后存储的位置并将其注入您的 webview 的 javascript 中。只有当locationManager
是null
时,您才应该这样做。而locationManager
会消耗电池电量,当用户不积极使用应用程序时最好不要使用它。
【讨论】:
以上是关于保存/恢复android webview的状态的主要内容,如果未能解决你的问题,请参考以下文章
Android Fragment使用 Activity, Fragment, WebView的状态保存和恢复