كيف يمكنني إيقاف محتوى الفلاش في عرض WebView Android عندما لا يكون نشاطي مرئيًا؟

StackOverflow https://stackoverflow.com/questions/3431351

سؤال

أقوم بتجربة استخدام WebView لعرض محتوى فلاش داخل نشاطي. كل شيء يعمل بشكل جيد ، ولكن عندما يضرب المستخدم مفتاح المنزل لوضع النشاط في الخلفية ، يستمر محتوى الفلاش في التشغيل (يستمر الصوت في اللعب ، إلخ)

لقد لاحظت أن كل من متصفح أندرويد ومستعرض الدلفين يتجنبون هذه المشكلة ، ويوقفون محتوى الفلاش بشكل صحيح عند وضع نشاط التصفح في الخلفية.

من الناحية المثالية ، أود حلًا يقتل 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) ، على الرغم من أنني أخشى أن يكون الرمز الذي كنت أبحث عنه أمرًا قديمًا ، لأنه يدعو إلى وظائف لا تتصل بها يبدو أنه موجود بعد الآن.

لقد تحقق من أن الدعوة إلى Peusetimers تعمل عن طريق الاختبار باستخدام مجموعة JavaScript SetInterval بسيطة تقوم بتحديث العداد. هل هناك شيء آخر واضح أنني يجب أن أحاول فيما يتعلق بالإدارة النافذة أو العرض؟

تقول الوثائق الخاصة بمشغل Flash Mobile:

سيقوم Flash Player أيضًا بإيقاف تشغيل SWF تلقائيًا أو لا يتم عرضه أو تطبيق المقدمة ، على سبيل المثال عند استلام المكالمة أو تنبيه ، لتقليل استخدام وحدة المعالجة المركزية واستخدام البطارية واستخدام الذاكرة.

يبدو أن هذا يعمل بشكل مثالي في كل من متصفح الأسهم ومستعرض الدلفين ، ولكن ليس في تطبيقي. أي أفكار/حلول سيكون موضع تقدير كبير!

تحديث: فيما يلي الوظيفة التي انتهى بنا الأمر إلى إضافتها إلى نشاطنا للحصول على هذا العمل. نحن نسميها مع "onpause" في وظيفة onpause النشاط و "onresume" في وظيفة 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);
        }
    }
}
هل كانت مفيدة؟

المحلول

لا أرى أين ترى ذلك BrowserActivity أو أي شيء يدعو pauseTimers(). أرى أين onPause() إلى عن على BrowserActivity في نهاية المطاف الطرق إلى onPause() من WebView. لكن، onPause() من WebView لديه @hide التعليقات التوضيحية وبالتالي ليست جزء من SDK. خارج الكفة ، يبدو أن onpause () هو ما تريد ، بالنظر إلى التعليق:

استدعاء هذا لإيقاف أي معالجة إضافية مرتبطة بهذا العرض وملابسه/الإضافات المرتبطة بها/javaScript/etc. على سبيل المثال ، إذا تم التخلص من العرض خارج الشاشة ، فيمكن استدعاء ذلك لتقليل وحدة المعالجة المركزية و/أو حركة الشبكة غير الضرورية. عندما يكون العرض "نشطًا" مرة أخرى ، استدعاء onResume ().

لاحظ الإشارة إلى "الإضافات" ، والتي لم يتم ذكرها في pauseTimers() توثيق.

سأحاول استخدام التفكير لمعرفة ما إذا كان onPause() (و لاحقا onResume(), ، عندما تريد أن تبدأ الأشياء من جديد) تفعل ما تحتاجه. إذا كان الأمر كذلك ، يرجى نشر مشكلة B.Android.com حول هذا ، اطلب منهم إضافة هذه الأساليب (أو المعادلات) إلى SDK. يبدو أن متطلباتك سيكون شائعًا ، والحل الذي يتجاوز SDK ليس حلاً جيدًا.

نصائح أخرى

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

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

هذه هي الطريقة التي تسميها في نشاطك ... يعمل مثل السحر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top