2010-08-07 8 views
20

मैं अपनी गतिविधि के अंदर फ्लैश सामग्री प्रदर्शित करने के लिए वेबव्यू का उपयोग कर प्रयोग कर रहा हूं। सब कुछ बहुत अच्छी तरह से काम कर रहा है, लेकिन जब उपयोगकर्ता पृष्ठभूमि में गतिविधि को रखने के लिए घर की कुंजी हिट करता है, तो फ्लैश सामग्री चलती रहती है (ध्वनि खेलती रहती है, आदि)मेरी गतिविधि दृश्यमान नहीं होने पर मैं एंड्रॉइड वेबव्यू में फ़्लैश सामग्री को कैसे रोकूं?

मैंने देखा है कि दोनों स्टॉक एंड्रॉइड ब्राउज़र और डॉल्फिन ब्राउज़र प्रतीत होता है कि इस समस्या से बचने के लिए, और ब्राउजिंग गतिविधि को पृष्ठभूमि में डालते समय फ्लैश सामग्री को ठीक से रोकें।

आदर्श रूप में मैं एक समाधान है कि पूरी तरह से WebView अगर गतिविधि खत्म मारता है चाहते हैं, लेकिन अन्यथा यह रुक जाता है

यहाँ (मूल रूप से ब्राउज़र के डिफ़ॉल्ट व्यवहार को कॉपी) एक साधारण परीक्षण मैं एक साथ रखा है कि एक लोड हो जाता है है Kongregate पर खेल है, जिसमें कुछ पृष्ठभूमि संगीत दिया है:

public class BrowserTest extends Activity { 
    private WebView mWebView; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      mWebView = new WebView(this); 
      mWebView.getSettings().setJavaScriptEnabled(true); 
      mWebView.getSettings().setPluginsEnabled(true); 

      mWebView.loadUrl("http://m.kongregate.com/games/Jiggmin/the-game-of-disorientation-mobile"); 
      setContentView(mWebView); 
     } 

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

      mWebView.pauseTimers(); 
      if(isFinishing()){ 
       mWebView.loadUrl("about:blank"); 
       setContentView(new FrameLayout(this)); 
      } 
     } 

     @Override 
     protected void onResume(){ 
      super.onResume(); 
      mWebView.resumeTimers(); 
     } 
    } 

मैं शेयर ब्राउज़र के लिए नवीनतम स्रोत पर एक नज़र ले लिया, और हालांकि मैं कोड मुझे डर है यह, कुछ इसी तरह (बुला pauseTimers/resumeTimers) कर किया जा रहा है देख रहे हैं कि पुराना है, क्योंकि यह उन कार्यों को बुला रहा है जो किसी भी प्रकार के अस्तित्व में नहीं लगते हैं ई।

मैंने सत्यापित किया कि पॉज़ टाइमर को कॉल एक साधारण जावास्क्रिप्ट सेट इंटरवल के साथ परीक्षण करके काम कर रहा है जो काउंटर अपडेट करता है। क्या कुछ और स्पष्ट है कि मुझे विंडो या व्यू प्रबंधन के संबंध में कोशिश करनी चाहिए?

मोबाइल फ़्लैश प्लेयर के लिए दस्तावेज़ का कहना है:

फ़्लैश प्लेयर भी स्वतः SWF प्लेबैक यह दृश्य या अग्रभूमि आवेदन में नहीं है रुकेगा, उदाहरण के लिए जब एक कॉल प्राप्त होता है या अलार्म के लिए बंद हो जाता है, सीपीयू उपयोग, बैटरी उपयोग और स्मृति उपयोग को कम करें।

यह स्टॉक ब्राउज़र और डॉल्फिन ब्राउज़र दोनों में पूरी तरह से काम कर रहा है, लेकिन मेरे ऐप में नहीं। किसी भी विचार/समाधान की सराहना की जाएगी!

अद्यतन: यहां वह कार्य है जिसे हम काम करने के लिए हमारी गतिविधि में जोड़ना समाप्त कर चुके हैं। हम गतिविधि के onResume समारोह में "onPause" गतिविधि के onPause समारोह में और "onResume" से कॉल करने की:

private void callHiddenWebViewMethod(String name){ 
    if(mWebView != null){ 
     try { 
      Method method = WebView.class.getMethod(name); 
      method.invoke(mWebView); 
     } catch (NoSuchMethodException e) { 
      Log.error("No such method: " + name, e); 
     } catch (IllegalAccessException e) { 
      Log.error("Illegal Access: " + name, e); 
     } catch (InvocationTargetException e) { 
      Log.error("Invocation Target Exception: " + name, e); 
     } 
    } 
} 
+0

आप इसे कैसे कहते हैं? क्या आपके पास उपयोग का कोड स्निपेट है? –

+1

एपीआई स्तर 11 के बाद प्रतिबिंब का उपयोग करने की आवश्यकता नहीं है। बस वेबव्यू के सार्वजनिक पर रोकें() और ऑनस्यूम() विधियों को कॉल करें। – cprcrack

उत्तर

8

मैं नहीं दिख रहा है जहाँ आप देख सकते हैं कि BrowserActivity या कुछ भी pauseTimers() बुला रहा है। मैं देखता हूं कि onPause()BrowserActivity के लिए WebView के onPause() पर रूट करता है। हालांकि, WebView के onPause() में @hide एनोटेशन है और इसलिए एसडीके का हिस्सा नहीं है।

कॉल यह इस दृश्य और इससे संबंधित डोम/plugins/जावास्क्रिप्ट/आदि के साथ जुड़े किसी भी अतिरिक्त प्रसंस्करण को रोकने के लिए: कफ के बाहर, यह onPause() की तरह प्रतीत होता है कि आप क्या चाहते हैं, टिप्पणी दी है । उदाहरण के लिए, यदि दृश्य ऑफ़स्क्रीन लिया गया है, तो इसे पर अनावश्यक CPU और/या नेटवर्क यातायात को कम करने के लिए कहा जा सकता है। जब दृश्य फिर से "सक्रिय" है, तो रेज़्यूम() पर कॉल करें।

"प्लगइन्स" के संदर्भ पर ध्यान दें, जिसका उल्लेख pauseTimers() दस्तावेज़ में नहीं किया गया है।

मैं onPause() (और बाद में onResume(), जब आप सामान फिर से शुरू करना चाहते हैं) देखने के लिए प्रतिबिंब का उपयोग करने का प्रयास करेंगे) जो आपको चाहिए वह करता है। यदि ऐसा होता है, तो कृपया इस मुद्दे को b.android.com पर पोस्ट करें, उन्हें इन विधियों (या समकक्ष) को एसडीके में जोड़ने के लिए कहें। आपकी आवश्यकता ऐसा लगता है कि यह एक आम होगा, और एसडीके के पीछे जाने वाला एक समाधान एक अच्छा समाधान नहीं है।

+1

पॉज़ टाइमर के लिए कॉल ब्राउज़र गतिविधि की रोकथाम ViewViewTimers विधि के अंदर है। मैं @ हाइड एनोटेशन से परिचित नहीं था, इसलिए मैंने सोचा कि शायद मैं किसी प्रकार का पुराना/अलग कोड ब्राउज़ कर रहा था। मुझे लगता है कि प्रतिबिंब का उपयोग करके पॉज़/ऑन रेज़्यूम पर कॉल करने का प्रयास करने का आपका सुझाव एक महान है, मैं आपको बता दूंगा कि यह कैसे काम करता है, धन्यवाद! – BenV

+0

यह पूरी तरह से काम करता है, मुझे @ हाइड एनोटेशन के बारे में भरने के लिए बहुत बहुत धन्यवाद, मुझे यह भी एहसास नहीं हुआ कि मैं प्रतिबिंब का उपयोग करके उन तरीकों से प्राप्त कर सकता हूं। जैसा कि आपने सुझाव दिया है, मैं b.android.com पर कोई समस्या पोस्ट करूंगा! – BenV

+0

@ बीएनवी: यह सुनकर खुशी हुई! यदि आप इसके बारे में सोचते हैं, तो इसे दर्ज करने के बाद इस मुद्दे के लिंक के साथ यहां एक टिप्पणी दें। मैं इस पर नजर रखना चाहता हूं। – CommonsWare

7
@Override 
protected void onPause() { 
    super.onPause(); 
    this.callHiddenWebViewMethod("onPause"); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    this.callHiddenWebViewMethod("onResume"); 
} 

इस तरह आप इसे अपनी गतिविधि में कहते हैं ... एक आकर्षण की तरह काम करता है।

संबंधित मुद्दे