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

时间:2010-08-07 17:22:58

标签: android android-webview android-2.2-froyo

我正在尝试使用WebView在我的活动中显示Flash内容。一切都运行良好,但当用户点击主键将活动放入后台时,Flash内容会继续运行(声音继续播放等)

我注意到Android浏览器和Dolphin浏览器似乎都避免了这个问题,并且在浏览活动进入后台时正确暂停Flash内容。

理想情况下,如果活动结束,我想要一个完全杀死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还会自动暂停不在视图或前台应用程序中的SWF播放,例如收到呼叫或闹钟响起时,以降低CPU利用率,电池使用率和内存使用率。

这似乎在股票浏览器和Dolphin Browser中都很完美,但在我的应用程序中却没有。任何想法/解决方案将不胜感激!

更新:以下是我们最终添加到我们的活动中以使其工作的功能。我们在活动的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);
        }
    }
}

2 个答案:

答案 0 :(得分:8)

我看不到您在哪里看到BrowserActivity或其他任何内容正在调用pauseTimers()。我确实看到onPause()的{​​{1}}最终路由到BrowserActivity的{​​{1}}。但是,onPause()的{​​{1}}具有WebView注释,因此不属于SDK。关闭袖口,看起来像onPause()是你想要的,给出评论:

  

调用此方法暂停任何额外的操作   与此视图关联的处理   及其相关的   DOM /插件/ JavaScript的/等。对于   例如,如果视图被采用   在屏幕外,可以调用它   减少不必要的CPU和/或网络   交通。当视图再次出现时   “active”,调用onResume()。

请注意“插件”的引用,onPause()文档中未提及。

我尝试使用反射来查看WebView(以及之后的@hide,当你想要重新启动的东西时)做你需要的。如果是,请向b.android.com发布一个问题,要求他们将这些方法(或等价物)添加到SDK中。您的要求似乎很常见,而且经过SDK的解决方案并不是一个好的解决方案。

答案 1 :(得分:7)

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

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

这就是你在活动中称呼它的方式......就像魅​​力一样。