我正在尝试使用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),虽然我担心我一直在看的代码已经过时了,因为它调用的函数是don似乎不再存在了.
我确实通过使用更新计数器的简单JavaScript setInterval进行测试来验证对pauseTimers的调用是否正常.对于Window或View管理,我应该尝试一些其他明显的东西吗?
移动Flash播放器的文档说:
Flash Player还将自动暂停不在视图或前台应用程序中的SWF播放,例如在收到呼叫或警报响起时,以降低CPU利用率,电池使用率和内存使用率.
这似乎在股票浏览器和Dolphin浏览器中都很完美,但在我的应用程序中却没有.任何想法/解决方案将不胜感激!
更新:这是我们最终添加到我们的活动以使其工作的功能.我们在活动的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); } } }
CommonsWare.. 8
我看不到你在哪里看到BrowserActivity
或有什么东西在呼唤pauseTimers()
.我确实看到onPause()
了BrowserActivity
最终路线onPause()
的位置WebView
.然而,onPause()
中WebView
有@hide
注释,所以是不是SDK的一部分.关闭袖口,看起来像onPause()是你想要的,给出评论:
调用此方法可暂停与此视图及其关联的DOM/plugins/javascript/etc相关的任何额外处理.例如,如果视图是在屏幕外拍摄的,则可以调用此视图以减少不必要的CPU和/或网络流量.当视图再次"活动"时,调用onResume().
请注意"插件"的引用,pauseTimers()
文档中未提及.
我会尝试使用反射来查看是否onPause()
(以及之后onResume()
,当你想要重新启动的东西时)做你需要的东西.如果是,请向b.android.com发布一个问题,要求他们将这些方法(或等价物)添加到SDK中.您的要求似乎很常见,而且经过SDK的解决方案并不是一个好的解决方案.
我看不到你在哪里看到BrowserActivity
或有什么东西在呼唤pauseTimers()
.我确实看到onPause()
了BrowserActivity
最终路线onPause()
的位置WebView
.然而,onPause()
中WebView
有@hide
注释,所以是不是SDK的一部分.关闭袖口,看起来像onPause()是你想要的,给出评论:
调用此方法可暂停与此视图及其关联的DOM/plugins/javascript/etc相关的任何额外处理.例如,如果视图是在屏幕外拍摄的,则可以调用此视图以减少不必要的CPU和/或网络流量.当视图再次"活动"时,调用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"); }
这就是你在活动中称呼它的方式......就像一个魅力.