android webview的保存/恢复状态

问题描述:

我有一个简单的webView应用程序,它从我们的网站加载一个页面,包含我们外地人员每天应该访问的位置和电话号码。它提供了一个启动导航或拨打电话的挂钩。从外部活动返回时,应用程序崩溃。打到手机的主页按钮,然后拨打电话,然后返回到应用程序工作正常。android webview的保存/恢复状态

这里的代码...

更新2 - 不再崩溃,网页流量是空白的,在返回

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(); 
} 
+0

你可以发布你的logcat输出吗? – 2011-03-25 20:46:27

+0

http://*.com/questions/1002085/android-webview-handling-orientation-changes – 2011-10-18 10:25:50

你不是应该设置你的myLocationManager和其他实例变量即使savedInstanceState != null

恢复WebView状态不会为您执行此操作,并且您的应用程序可能会在尝试对其中的一个进行取消注册时崩溃,并为您提供NullPointerException

+0

能够立即返回到应用程序而不会崩溃,但只是获得应用程序标题的空白webbview。另外,不能在仿真器中重现。 – RNeumann 2011-03-27 21:27:20

+0

也许你可以用你当前的代码更新这个问题? – 2011-03-27 22:47:57

+0

最重要的是,我不知何故设法搞砸了我的机器上的eclipse,现在无法打开模拟器。今天上午进行重新安装。 – RNeumann 2011-03-28 12:44:12

恢复您的应用程序后,应用locationManager.getLastKnownLocation获取上次存储的位置并将其注入到您的webview的javascript内。只有在locationManagernull时,您才应该这样做。并且locationManager消耗电池,当用户不主动使用该应用时,明智地不使用它。

启用以下属性,除了上面的代码工作就像一个魅力:)

android:launchMode="singleInstance" 
android:alwaysRetainTaskState="true" 

包含在AndroidManifest.xml中的WebView每个活动为我工作。虽然这是一个普遍的答案,但会解决你和其他许多这样的人陷入这个问题。