保存/恢复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 中。只有当locationManagernull 时,您才应该这样做。而locationManager 会消耗电池电量,当用户不积极使用应用程序时最好不要使用它。

【讨论】:

以上是关于保存/恢复android webview的状态的主要内容,如果未能解决你的问题,请参考以下文章

Android Fragment使用 Activity, Fragment, WebView的状态保存和恢复

保存/恢复android webview的状态

应用关闭时Android WebView保存显示状态

Android - 恢复 Fragment WebView 状态以避免重新加载

Android 下的 WebView 中数据如何保存

Android——保存和恢复用户状态