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

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

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

理想情况下,我想要一个解决scheme,完全杀死WebView,如果活动结束,但暂停,否则(基本上复制浏览器的默认行为)

这里有一个简单的testing,我把它放在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),尽pipe我担心我一直在看的代码已经过时了,因为它调用的函数不是似乎再也不存在了。

我确实通过testing一个简单的JavaScript setInterval来更新一个计数器来调用pauseTimers。 还有什么其他的显而易见的,我应该试图在窗口或视图pipe理?

手机Flash播放器的文档说:

Flash Player也将自动暂停SWF回放,例如当收到呼叫或闹铃响起时,它不在视图或前台应用程序中,以减lessCPU使用率,电池使用情况和内存使用情况。

这似乎是在股票浏览器和海豚浏览器,但在我的应用程序完美的工作。 任何想法/解决scheme将不胜感激!

更新:这是我们最终添加到我们的活动,以使其工作的function。 我们用活动的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() 。 我确实看到了BrowserActivity onPause()最终路由到WebView onPause() 。 但是, WebView onPause()具有@hide注释,因此不属于SDK的一部分。 closures袖口,它看起来像onPause()是你想要的,给出的评论:

调用此方法可暂停与此视图及其关联的DOM /插件/ javascript /等相关的任何额外处理。 例如,如果视图脱离屏幕,则可以调用此视图以减less不必要的CPU和/或networkingstream量。 当视图再次“激活”时,调用onResume()。

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

我会尝试使用reflection来查看onPause() (以及稍后的onResume() ,当你想要再次启动的东西)是否做你需要的。 如果是这样,请将问题发布到b.android.com ,要求他们将这些方法(或等价物)添加到SDK中。 您的需求似乎是一个常见的解决scheme,而通过SDK的解决scheme并不是一个好的解决scheme。

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

这就是你如何在你的活动中称之为…就像一个魅力。