मेरे पास एक एंड्रॉइड ऐप है, जो एक एम्बेडेड PhoneGap WebView
का उपयोग करता है। मैंने अपनी गतिविधि पर CordovaInterface
सफलतापूर्वक कार्यान्वित किया है और ऐप शुरू होता है और इसे कैसे कार्य करना चाहिए।एम्बेडेड फोनगैप ऐप में वेबव्यू को सहेजें और पुनर्स्थापित करें
जब मैं अनुप्रयोग (एक अन्य एप्लिकेशन पर स्विच करने या होम टैब) को रोक देना, मैं बचाने saveState
विधि है, जो जब एप्लिकेशन फिर से शुरू होता बहाल किया जाना चाहिए के साथ 'WebView
राज्य (इस दृष्टिकोण PhoneGap
बिना किसी ऐप्लिकेशन में काम करता है)।
हालांकि, जब ऐप फिर से शुरू होता है, तो मैं पहले यूआरएल लोड किए बिना (restoreState
विधि के साथ) को पुनर्स्थापित करने का प्रयास करता हूं (क्योंकि मैं अंतिम स्थिति का उपयोग करना चाहता हूं)। यह एक त्रुटि का कारण बनता है क्योंकि फोनगैप एक यूआरएल लोड होने की अपेक्षा करता है (कम से कम यही मैं अपवाद से इकट्ठा करता हूं)।
मेरा प्रश्न है: मैं वेबव्यू के राज्य को एक एम्बेडेड फोनगैप वेबव्यू में सही ढंग से कैसे सहेज सकता हूं और पुनर्स्थापित कैसे कर सकता हूं?
मेरे onCreate
विधि:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
webView = (CordovaWebView) findViewById(R.id.webView);
if (savedInstanceState == null) {
savedInstanceState = restoreFromPreferences();
}
if (savedInstanceState == null) {
webView.loadUrl("file:///android_asset/www/index.html");
} else {
webView.restoreState(savedInstanceState);
webView.loadUrlIntoView(savedInstanceState.getString("url"));
}
}
मेरे विधि (onSaveInstanceState
में इसी तरह के तर्क):
@Override
protected void onPause() {
super.onPause();
Bundle out = new Bundle();
webView.saveState(out);
saveToPreferences(out);
}
त्रुटि जब बंद करने/रोक एप्लिकेशन (हल - देखने को अद्यतन 1):
जब मैं ऐप बंद करता हूं तो मुझे एक त्रुटि मिलती है। यह शायद संबंधित है, लेकिन मैं देख पा रहे हैं कि कैसे:
01-09 11:44:50.181: E/ActivityThread(2068): Activity my.package.MainActivity has leaked IntentReceiver [email protected] that was originally registered here. Are you missing a call to unregisterReceiver()?
01-09 11:44:50.181: E/ActivityThread(2068): android.app.IntentReceiverLeaked: Activity my.package.MainActivity has leaked IntentReceiver [email protected] that was originally registered here. Are you missing a call to unregisterReceiver()?
...
समय त्रुटि एप्लिकेशन फिर से शुरू करने (हल - अद्यतन 1 देखें):
यह एक त्रुटि का कारण बनता है, क्योंकि WebView लोड करने के लिए कोशिश करता है एक यूआरएल जो रिक्त है:
01-09 11:38:22.813: E/AndroidRuntime(1979): FATAL EXCEPTION: main
01-09 11:38:22.813: E/AndroidRuntime(1979): java.lang.NullPointerException
01-09 11:38:22.813: E/AndroidRuntime(1979): at java.lang.String.indexOf(String.java:994)
01-09 11:38:22.813: E/AndroidRuntime(1979): at org.apache.cordova.CordovaWebView.loadUrlNow(CordovaWebView.java:499)
01-09 11:38:22.813: E/AndroidRuntime(1979): at org.apache.cordova.CordovaWebView.loadUrl(CordovaWebView.java:384)
01-09 11:38:22.813: E/AndroidRuntime(1979): at org.apache.cordova.CordovaWebViewClient.onPageFinished(CordovaWebViewClient.java:298)
01-09 11:38:22.813: E/AndroidRuntime(1979): at android.webkit.CallbackProxy.handleMessage(CallbackProxy.java:327)
01-09 11:38:22.813: E/AndroidRuntime(1979): at android.os.Handler.dispatchMessage(Handler.java:99)
01-09 11:38:22.813: E/AndroidRuntime(1979): at android.os.Looper.loop(Looper.java:137)
01-09 11:38:22.813: E/AndroidRuntime(1979): at android.app.ActivityThread.main(ActivityThread.java:4745)
01-09 11:38:22.813: E/AndroidRuntime(1979): at java.lang.reflect.Method.invokeNative(Native Method)
01-09 11:38:22.813: E/AndroidRuntime(1979): at java.lang.reflect.Method.invoke(Method.java:511)
01-09 11:38:22.813: E/AndroidRuntime(1979): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
01-09 11:38:22.813: E/AndroidRuntime(1979): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
01-09 11:38:22.813: E/AndroidRuntime(1979): at dalvik.system.NativeStart.main(Native Method)
अद्यतन 1:
दोनों त्रुटियाँ हैं हल किया गया लेकिन एक नए द्वारा प्रतिस्थापित किया गया।
पहली त्रुटि इसलिए थी क्योंकि webView.handleDestroy()
onDestroy()
में नहीं कहा गया था।
दूसरी त्रुटि CordovaWebView
में baseUrl
फ़ील्ड के कारण थी जो सेट नहीं है। वर्तमान में मैं कि हल करने SharedPreferences
में पिछली बार देखे यूआरएल को सहेज कर कोशिश कर रहा हूँ जब onPause()/onSaveInstanceState()
होते हैं:
String url = webView.peekAtUrlStack();
out.putString("url", url);
webView.handlePause(true);
onResume()
में, मैं SharedPreferences
में यूआरएल लोड:
if (savedInstanceState != null) {
webView.restoreState(savedInstanceState);
webView.loadUrlIntoView(savedInstanceState.getString("url"));
}
अब मैं एक और बुरा मिल () त्रुटि। अजीब चीज यह है कि ऐप तुरंत दुर्घटनाग्रस्त हो जाता है (अधिसूचना के बिना)। कुछ कोशिशों के बाद यह वैसे भी शुरू होता है।
01-09 15:11:19.869: A/libc(3392): Fatal signal 11 (SIGSEGV) at 0x00000008 (code=1), thread 3404 (WebViewCoreThre)
01-09 15:11:19.925: I/ActivityManager(281): Displayed my.package/.MainActivity: +197ms
01-09 15:11:19.973: I/DEBUG(86): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
01-09 15:11:19.973: I/DEBUG(86): Build fingerprint: 'generic/vbox86tp/vbox86tp:4.1.1/JRO03L/eng.dan.20121106.232935:userdebug/test-keys'
01-09 15:11:19.973: I/DEBUG(86): pid: 3392, tid: 3404, name: WebViewCoreThre >>> my.package <<<
01-09 15:11:19.973: I/DEBUG(86): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000008
01-09 15:11:20.249: I/DEBUG(86): eax 00000000 ebx b6b61c98 ecx 00000000 edx 00000001
...
अद्यतन 2:
WebView राज्य पुनर्स्थापित कर रहा है दो बार हुआ है, जो समस्याओं के कारण यहाँ त्रुटि है। तो इसे onResume
से हटा दिया गया।
क्या यह संभव है ['onPause'] (http://docs.phonegap.com/en/1.1.0/phonegap_events_events.md.html#pause) और [' onResume'] (http: // docs फ़ोन गैप से .phonegap.com/en/1.1.0/phonegap_events_events.md.html # फिर से शुरू करें) विधियां। – GoodSp33d
ऑनक्रेट और नष्ट कोड मेरे लिए काम किया! धन्यवाद। peekAtUrlStack विधि मेरे कॉर्डोवा पुस्तकालय में प्रतीत नहीं होता है ... मेरे पास v2.9.1 है –