android - 当我的 Activity 不可见时,如何在 Android WebView 中暂停 Flash 内容?

标签 android android-webview android-2.2-froyo

我正在尝试使用 WebView 在我的 Activity 中显示 Flash 内容。一切运行良好,但是当用户点击 home 键将 Activity 置于后台时,Flash 内容继续运行(声音继续播放等)

我注意到现有的 Android 浏览器和 Dolphin 浏览器似乎都避免了这个问题,并且在将浏览 Activity 置于后台时会正确暂停 Flash 内容。

理想情况下,我想要一个解决方案,如果 Activity 正在完成,则完全终止 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),尽管我担心我一直在查看的代码已经过时,因为它正在调用似乎不再存在的功能。

我确实通过使用更新计数器的简单 JavaScript setInterval 进行测试来验证对 pauseTimers 的调用是否有效。在 Window 或 View 管理方面,我还应该尝试一些其他明显的事情吗?

移动 Flash 播放器的文档说:

Flash Player will also automatically pause SWF playback it is not in view or the foreground application, for example when a call is received or alarm goes off, to reduce CPU utilization, battery usage and memory usage.

这似乎在股票浏览器和海豚浏览器中都能完美运行,但在我的应用程序中却不行。任何想法/解决方案将不胜感激!

更新:这是我们最终添加到 Activity 中以使其正常工作的功能。我们在 Activity 的 onPause 函数中使用“onPause”来调用它,在 Activity 的 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() 的东西。我确实看到 BrowserActivityonPause() 最终路由到 WebViewonPause() 的位置。但是,WebViewonPause() 具有 @hide 注释,因此不是 SDK 的一部分。从袖口开始,看起来 onPause() 就是你想要的,给出评论:

Call this to pause any extra processing associated with this view and its associated DOM/plugins/javascript/etc. For example, if the view is taken offscreen, this could be called to reduce unnecessary CPU and/or network traffic. When the view is again "active", call onResume().

注意对“插件”的引用,pauseTimers() 文档中没有提及。

我会尝试使用反射来查看 onPause()(以及稍后的 onResume(),当您希望重新启动时)是否满足您的需求。如果是,请将问题发布到 b.android.com关于这一点,要求他们将这些方法(或等效方法)添加到 SDK。您的要求似乎很常见,而超出 SDK 的解决方案并不是一个好的解决方案。

关于android - 当我的 Activity 不可见时,如何在 Android WebView 中暂停 Flash 内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3431351/

相关文章:

android - 为什么不能从另一个线程调用 OpenGL ES 函数

java - android中如何检测两条路径是否相交?

android - 如何关闭所有 Activity 并退出应用程序

webview - flutter setJavaScriptEnabled setWebChromeClient

安卓 : View Internal storage file in webview

android - LG Optimus 2X Speed 的前置摄像头

android - 如何旋转照片而不丢失Exif和元数据?

java - 将 Google map 添加到 Flutter 时找不到 API key

android - 文本选择的 WebView 上的灰色框问题

android - 在选项卡之间传递 ArrayList<String>