开发者

save/restore state of android webview

开发者 https://www.devze.com 2023-02-19 15:44 出处:网络
I have a simple webView app which loads a page from our site with locations and phone numbers that our field guys are supposed to visit each day.It provides a hook to launch navigation or dial the pho

I have a simple webView app which loads a page from our site with locations and phone numbers that our field guys are supposed to visit each day. It provides a hook to launch navigation or dial the phone. When returning from the outside activity, the app is crashing. Hitting the phone's home button then dialing the phone, then returning to the app works fine.

here's the code...

Update 2 - No longer crashing, webview is blank upon returning

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(stat开发者_开发技巧e);
    //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();
}


Shouldn't you be setting your myLocationManager and other instance variables even if savedInstanceState != null?

Restoring the WebView state isn't going to do this for you, and your app is probably crashing when it tries to derefence one of them, giving you a NullPointerException.


Enabling the following properties,in addition to the above code works like a charm :)

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

for each activity containing the WebView in AndroidManifest.xml worked for me. Although it is a generalized answer, would solve your and many other such people stuck with this problem.


Upon resuming your app, apply locationManager.getLastKnownLocation to get the last stored location and inject it inside your webview's javascript. You should do this only if the locationManager is null. And locationManager drains battery, it would be wise not to use it when the user is not actively using the app.

0

精彩评论

暂无评论...
验证码 换一张
取 消