2013-01-09 24 views
6

मेरे पास एक एंड्रॉइड ऐप है, जो एक एम्बेडेड 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 से हटा दिया गया।

उत्तर

10

एक एम्बेडेड CordovaWebView बहाल करने के साथ समस्याओं थे क्योंकि onPause(), onResume(), onCreate() और onDestroy() में CordovaWebView के साथ बातचीत सही ढंग से नहीं होती है। ठीक करने के लिए, पुनर्स्थापित करें() दो बार हुआ जिससे आगे की समस्याएं आईं।

onCreate: राज्य को बहाल करने के लिए

इसके बाद, ई सेटअप करने के लिए CordovaWebView आधार यूआरएल विधि loadUrlIntoView() का उपयोग करके की जरूरत है:

webView.restoreState(savedInstanceState); 
webView.loadUrlIntoView(savedInstanceState.getString("url")); 

OnDestroy:

हम पर अमल करने की जरूरत है handleDestroy() सभी फोनगैप संबंधित सामग्री को साफ़ करने के लिए, जैसे प्लगइनमैनेजर, प्रसारण रिसीवर, ...:

@Override 
public void onDestroy() { 
    super.onDestroy(); 

    webView.handleDestroy(); 
} 

onPause:

onPause() में, हम CordovaWebView के राज्य की दुकान। हम अंतिम पंजीकृत यूआरएल देखते हैं और हम इसे SharedPreferences में स्टोर करते हैं। इसके अलावा, handlePause() को कॉल करने की आवश्यकता है।

@Override 
protected void onPause() { 
    super.onPause(); 

    String url = webView.peekAtUrlStack(); 
    webView.handlePause(true); 

    Bundle out = new Bundle(); 
    webView.saveState(out); 
    out.putString("url", url); 

    saveToPreferences(out); 
} 

onResume:

webView.handleResume(true, false); 

निष्कर्ष::

एकएम्बेड

onResume() हम CordovaWebView के handleResume() कॉल करने की आवश्यकताऔर इसकी स्थिति को सहेजना और बहाल करना संभव है, लेकिन क्योंकि आपको DroidGap & CordovaWebView से बहुत से आंतरिक पता होना है, ऐसा करने की सलाह नहीं दी जाती है।

मुझे आशा है कि मेरा उत्तर किसी की मदद करेगा।

+0

क्या यह संभव है ['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

+0

ऑनक्रेट और नष्ट कोड मेरे लिए काम किया! धन्यवाद। peekAtUrlStack विधि मेरे कॉर्डोवा पुस्तकालय में प्रतीत नहीं होता है ... मेरे पास v2.9.1 है –