保存/恢复android webview的状态

我有一个简单的webView应用程序,从我们的网站加载一个页面的位置和电话号码,我们的领域人应该访问每一天。 它提供了一个挂钩来启动导航或拨打电话。 从外部活动返回时,应用程序崩溃。 打到手机的主页button,然后拨打电话,然后返回到应用程序工作正常。

这是代码

更新2 – 不再崩溃,webview返回时是空白的

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

Solutions Collecting From Web of "保存/恢复android webview的状态"

你不应该设置你的myLocationManager和其他实例variables,即使savedInstanceState != null

恢复WebView状态不会为你做这件事,而你的应用程序可能会崩溃,当它试图derefence其中之一,给你一个NullPointerException

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

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

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

一旦恢复你的应用程序,应用locationManager.getLastKnownLocation获取最后存储的位置,并将其注入到您的webview的JavaScript内。 只有在locationManagernull情况下才应该这样做。 和locationManager消耗电池,这是明智的不使用它时,用户不积极使用应用程序。